我正在使用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;
但是是混乱和递归的,这将使节点难以读取和编译。是否有任何非递归或至少更简单的方法来解析它?