代码之家  ›  专栏  ›  技术社区  ›  user76035

解析具有未定义数量的参数的表达式

  •  1
  • user76035  · 技术社区  · 15 年前

    我正在尝试将自制语言中的字符串解析为一种树,例如:

    # a * b1 b2 -> c * d1 d2 -> e # f1 f2 * g
    

    应导致:

    # a
      * b1 b2
        -> c
      * d1 d2
        -> e
    # f1 f2
      * g
    

    #、*和->是符号。a、 b1等是文本。

    从现在起,我只知道rpn方法来计算表达式,我目前的解决方案如下。如果我只允许在每个符号后使用一个文本标记,我可以很容易地首先将表达式转换为RPN符号(b=b1 b2;d=d1 d2;f=f1 f2)并从这里解析它:

    a b c->*d e->*#f g*#

    a M b2 b1 M c->*M d2 d1 M e->#f2 f1米g*#

    也就是说:

    1. 有没有人有过类似的经验,可以说这是或不是未来可行的解决方案?
    2. 是否有更好的方法来解析具有未定义运算符数的表达式?
    3. 你能告诉我一些好的资源吗?

    谢谢你的帮助。

    编辑:看来我要找的是带有可变参数数的后缀符号的源代码。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Community TheSoundDefense    4 年前

    我无法完全理解您的问题,但您需要的似乎是语法定义和解析器生成器。我建议你看一看 ANTLR ,为原始语法或RPN定义语法应该非常简单。

    (经过自我批评,并努力理解问题的细节)实际上,从你的例子中,语言语法是不清楚的。然而,在我看来,前缀/后缀符号的优点(即,您既不需要括号,也不需要具有优先级意识的解析器)源自以下事实: 知道参数的数量

    # a * b c d
    

    以下三项中哪一项是标准形式?

    1. (a、*(b、c、d))

    2. (a,*(b,c),d)

    如果不了解运营商的更多信息,就无法判断。当然,您可以定义运算符的某种贪婪性,例如,*比#更贪婪,因此它会吞噬所有参数。但是这会超出前缀符号的用途,因为你根本无法写出上面三个变量中的第二个变量;不是没有额外的句法成分。

    现在我想起来了,我所知道的编程语言中可能没有一种是完全不支持的 具有可变数量的参数,仅 职能/程序 .