parsing - ANTLR 表达式列表冲突

parsing - ANTLR 表达式列表冲突

INT你的规则有问题:

INT : '0'..'9'*;

匹配一个空字符串。它应该始终匹配至少 1 个字符:

INT : '0'..'9'+;

除此之外,它似乎工作得很好。

给定语法:

grammar T;

options {

output=AST;

}

tokens {

LIST;

}

parse : list EOF -> list;

list : infix+ -> ^(LIST infix+);

infix : prefix (INFIX_OP^ prefix)*;

prefix : postfix -> postfix

| PREFIX_OP postfix -> ^(PREFIX_OP postfix)

;

postfix : INT (POSTFIX_OP^)?;

POSTFIX_OP : '!';

INFIX_OP : '+';

PREFIX_OP : '-';

INT : '0'..'9'+;

SPACE : ' ' {skip();};

它解析输入:

4 5 2+3 1 6

进入以下AST:

编辑

引入既可用于后置表达式也可用于中缀表达式的运算符会使您变得list模棱两可(嗯,在我下面的版本中,就是... :))。因此,我将在此演示中保留逗号:

grammar T;

options {

output=AST;

}

tokens {

LIST;

P_ADD;

}

parse : list EOF -> list;

list : expr (',' expr)* -> ^(LIST expr+);

expr : postfix_expr;

postfix_expr : (infix_expr -> infix_expr) (ADD -> ^(P_ADD infix_expr))?;

infix_expr : atom ((ADD | SUB)^ atom)*;

atom : INT;

ADD : '+';

SUB : '-';

INT : '0'..'9'+;

SPACE : ' ' {skip();};

在上面的语法中,+作为中缀运算符优先于后缀版本,正如您在解析输入时看到的那样2+5+:

相关推荐

新手怎么练倒车技术?新手倒车为何控制不住速度 365体育旧版本怎么下载
WOW燃烧远征专题 365体育旧版本怎么下载

WOW燃烧远征专题

06-29 👁️ 7987
致敬经典 2018世界杯官方用球电视之星18发布 365体育投注网址亚洲下载