0

我正在使用TinyPG,它是一个 LL1 解析器生成器,来解析 lambda 演算。我正在尝试编写一个规则来解析函数应用程序,比如(a b)or(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;

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

4

1 回答 1

1

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

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

“跳过”并不意味着“删除”。这意味着扫描器应该识别令牌然后忽略它。如果您跳过空格,空格仍然可以很好地分隔字母数字标记。您只是不需要在语法中包含空格标记,剩下的是:

APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES;

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

于 2015-05-13T02:19:15.617 回答