ANTLR-如何跳过';对于';环

ANTLR-如何跳过';对于';环,antlr,antlr4,Antlr,Antlr4,我正在开发一种“玩具”语言来学习antlr 我对for循环的构造如下所示 对于(4,10){ //程序表达式 }; 我有一个我认为有效的语法,但它有点难看。具体来说,我不确定我是否很好地处理了语义上不重要的标记 例如,中间的逗号出现为令牌,但对于解析器来说并不重要,它只需要2和3的循环边界。这意味着当我看到循环标记部分的child()元素时,我必须跳过不重要的元素 如果检查ANTLR查看器并查看解析树,您可能会看到最好的结果。红色箭头指向我认为是多余的代币 我觉得我应该比现在更多地使用sk

我正在开发一种“玩具”语言来学习antlr

我对
for
循环的构造如下所示


对于(4,10){
//程序表达式
};

我有一个我认为有效的语法,但它有点难看。具体来说,我不确定我是否很好地处理了语义上不重要的标记

例如,中间的逗号出现为令牌,但对于解析器来说并不重要,它只需要2和3的循环边界。这意味着当我看到

循环
标记部分的
child()
元素时,我必须跳过不重要的元素

如果检查ANTLR查看器并查看解析树,您可能会看到最好的结果。红色箭头指向我认为是多余的代币

我觉得我应该比现在更多地使用
skip()
特性,但我看不出如何在这个级别插入标记的语法


循环:'for('foridxitem','foridxitem'){'(programmexpression)+'}';
foridxitem:NUM#ForIndexNumÌ
|
var#ForIndexVar;

简而言之,Antlr会生成一个解析树,因此在遍历树时,总会有需要跳过或忽略的错误

较长的答案是,在词法分析器中跳过cruft和生成有限语法值的标记之间存在紧张关系,尽管如此,这些标记对于编写明确的规则是必要的

例如,您将(的
标识为跳过的候选项,但可能在语法上是必需的。相反,参数逗号可能确实没有语法意义。因此,您可以通过以下方式在词法分析器(和解析器)中清除它:

FOR: 'for(' -> pushMode(params) ;
ENDLOOP: '}' ;
WS: .... -> skip() ;

mode params;
NUM: .... ;
VAR: .... ;
COMMA: ',' -> skip() ;
ENDPARAMS: '){' -> skip(), popMode() ;
P_WS: .... -> skip() ;
你的帕累尔法则就变成了

loop: FOR foridxitem* programexpression+ ENDLOOP ;
foridxitem: NUM | VAR ;
programexpression: .... ;
那应该会把树清理干净一点