使用LL1解析器解析lambda演算样式函数应用程序

时间:2015-05-13 01:41:16

标签: parsing ll tinypg

我正在使用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;

但是它是乱的和递归的,这将使得难以读取和编译节点。是否有任何非递归或至少更简单的方法来解析它?

1 个答案:

答案 0 :(得分:1)

没有理由将解析器与空格混淆。使用[Skip]属性在扫描程序中忽略它就足够了,如教程中所示:

[Skip] WHITESPACE -> @"\s+";

"跳过"并不意味着"删除"。这意味着扫描程序应识别令牌然后忽略它。如果你跳过空格,空格仍然可以将字母数字标记分开。您不需要在语法中包含空格标记,只需:

APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES;

(实际上,通常允许空的应用程序列表,所以我用*而不是+来编写它。但它是你的语言。)