我正在使用TinyPG(一个LL1解析器生成器)来解析lambda演算。我正在尝试编写一个将解析函数应用程序的规则,如(a b)
或(a b c)
等。
到目前为止,我有这个规则(有点简化):
APPLICATION -> LPARENTHESES VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;
但是,它无法解析左侧后面和右侧括号前面有空格的术语:( a b )
。我可以在开始括号之后允许空格如下:
APPLICATION -> LPARENTHESES SPACE* VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;
但我在设置它以在结束括号之前允许空格时遇到问题。我想出了这个,这似乎有效:
ARG_LIST -> (RPARENTHESES | (SPACE+ (RPARENTHESES | (VARIABLE ARG_LIST))));
APPLICATION -> LPARENTHESES SPACE* VARIABLE ARG_LIST;
但是它是乱的和递归的,这将使得难以读取和编译节点。是否有任何非递归或至少更简单的方法来解析它?
答案 0 :(得分:1)
没有理由将解析器与空格混淆。使用[Skip]
属性在扫描程序中忽略它就足够了,如教程中所示:
[Skip] WHITESPACE -> @"\s+";
"跳过"并不意味着"删除"。这意味着扫描程序应识别令牌然后忽略它。如果你跳过空格,空格仍然可以将字母数字标记分开。您不需要在语法中包含空格标记,只需:
APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES;
(实际上,通常允许空的应用程序列表,所以我用*
而不是+
来编写它。但它是你的语言。)