使用未定义数量的参数解析表达式

时间:2009-03-18 09:59:07

标签: algorithm parsing nlp rpn

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

# 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 *#

但是,合并文本标记和其他任何内容似乎都存在问题。我的想法是创建标记令牌(M),因此RPN看起来像:

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

这也是可解析的,似乎解决了这个问题。

那说:

  1. 有没有人有类似的经验,可以说它是或者它不是未来的可行解决方案?
  2. 是否有更好的方法来解析具有未定义运算符的表达式?
  3. 你能指点我一些好资源吗?
  4. 请注意。是的,我知道这个例子非常类似于Lisp前缀表示法,也许可以去添加一些括号,但我没有任何经验。但是,源文本不能包含任何人工括号,而且我不知道如何处理潜在的中缀mixins,例如#a * b - > [if value1 = value2] c - > d。

    感谢您的帮助。

    编辑:我正在寻找的是带有可变数量参数的后缀表示法的来源。

1 个答案:

答案 0 :(得分:3)

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

编辑:(在进行自我批评,并努力理解问题细节之后。)实际上,语言语法在您的示例中并不清楚。但是,在我看来,前缀/后缀符号的优点(即您既不需要括号也不需要优先级识别解析器)源于您每次都知道参数的数量这一事实您遇到一个运算符,因此您确切地知道要读取多少元素(用于前缀表示法)或从堆栈弹出(用于后缀表示法)。 OTOH,我相信拥有可以具有可变数量的参数的运算符使得前缀/后缀符号不仅难以解析而且完全不明确。以下面的表达式为例:

# a * b c d

以下哪三项是规范形式?

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

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

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

  4. 在不了解运营商的情况下,无法分辨。当然你可以定义操作符的某种贪婪,例如*比#更贪婪,所以它吞噬了所有的论点。但这会超过前缀表示法的目的,因为你根本无法从上面的三个中写下第二个变体;并非没有附加的句法元素。

    现在我想到了,我认识的编程语言都不支持带有可变数量参数的运算符,只有函数/过程