ANTLR 4:在输入脚本中使用自定义语法关键字

ANTLR 4:在输入脚本中使用自定义语法关键字,antlr,antlr4,Antlr,Antlr4,我遇到的情况是,输入脚本中使用了语法中的关键字,用户基本上可以键入任何内容(例如变量名)。但是ANTLR在解析脚本时不喜欢这样 我知道大多数语言都有一组保留关键字,这些关键字在源代码中几乎是禁止的,因为它们会妨碍解析 但我认为我的语法规则足够清晰,ANTLR不会感到困惑 下面是语法的简化版本: grammar test; script : statements EOF ; statements : statement* ; statement : (output_statement | v

我遇到的情况是,输入脚本中使用了语法中的关键字,用户基本上可以键入任何内容(例如变量名)。但是ANTLR在解析脚本时不喜欢这样

我知道大多数语言都有一组保留关键字,这些关键字在源代码中几乎是禁止的,因为它们会妨碍解析

但我认为我的语法规则足够清晰,ANTLR不会感到困惑

下面是语法的简化版本:

grammar test;

script : statements EOF ;

statements : statement* ;

statement : (output_statement | variable_statement) ;

output_statement : identifier ('format' column_format) ;

column_format : STRING_LITERAL;

variable_statement : identifier '=' STRING_LITERAL ;

identifier : IDENTIFIER ;

IDENTIFIER : [a-z]+ ;

STRING_LITERAL : '"' ( ~[\\\r\n"] )* '"' ;

WS : [ \t\r\n\u000C]+ -> channel(HIDDEN) ;
以下解析为ok:

x = "a"
x format "str"
但下一个输入文本不分析:

format = "a"
format format "str"
测试::脚本:1:0:不匹配的输入“格式”应为EOF

有没有什么方法来组织我的语法,使“格式”可以作为标识符


谢谢。

因为
格式既是关键字又是标识符:

output_statement : identifier (FORMAT column_format) ;
.....
identifier : IDENTIFIER | FORMAT ;
.....
FORMAT     : 'format' ;
IDENTIFIER : [a-z]+ ;
.....