【发布时间】:2012-12-20 21:10:27
【问题描述】:
我正在尝试匹配平衡括号,这样,如果进行匹配,则会创建一个 PARAMS 树,否则 LPARAM 和 RPARAM 令牌将作为原子添加到树中...
tokens
{
LIST;
PARAMS;
}
start : list -> ^(LIST list);
list : (expr|atom)+;
expr : LPARAM list? RPARAM -> ^(PARAMS list?);
atom : INT | LPARAM | RPARAM;
INT : '0'..'9'+;
LPARAM : '(';
RPARAM : ')';
目前,它永远不会创建 PARAMS 树,因为在规则 expr 中,它总是将结尾 RPARAM 视为原子,而不是该规则的结束标记。
因此,目前,1 2 3 (4) 5 之类的内容作为标记的平面列表添加到 LIST 树中,而不是所需的分组。
我之前处理过将标记作为原子添加到树中,但它们永远无法启动另一个规则,就像 LPARAM 在这里所做的那样。
我需要某种语法/语义谓词吗?
【问题讨论】:
-
LPARAM和RPARAM实际上是原子还是它们是表示列表开头和结尾的句法标记?是否有一种情况是您希望将一个视为原子,而另一种情况应将其视为标记? -
是的,LPARAM 和 RPARAM 可以单独出现在树中。它们不仅仅是句法标记。我希望它们被视为标记,只有当它实际上可以匹配带括号的表达式时。所以在“1 2 (3)”中,(3) 应该是带括号的表达式,结果树应该是 ^(LIST 1 2 ^(PARAMS 3))。而不成功的匹配,例如 1 2 )3) 应该变成 ^(LIST 1 2 ) 3 ))。
-
我明白了。语法应该如何处理像“1(2)3)”这样的输入?应该是“1 ^(LIST 2) 3 ')'”还是“1 ^(LIST 2 ')' 3 )”?
-
“(1(2)3”呢?是“
^(LIST '(' 2) 3”还是“'(' 1 ^(LIST 2) 3”? -
第二个。只要字符串的任何部分都可以通过左括号和右括号成功平衡,则将其创建为 PARAMS 树,否则将失败,LPARAM/RPARAM 应作为原子添加。
标签: parsing antlr grammar expression