ANTLR 4:在输入脚本中使用自定义语法关键字
ANTLR 4: Using custom grammar keywords in input script
我 运行 在输入脚本中使用了我语法中的关键字,用户基本上可以在其中键入任何内容(例如变量名)。但是 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) ;
以下解析正确:
x = "a"
x format "str"
但是下一个输入文本没有解析:
format = "a"
format format "str"
test::script:1:0: 不匹配的输入 'format' 期待 EOF
有什么方法可以构造我的语法,以便 "format" 可以作为标识符吗?
谢谢。
由于 format
既是关键字又是标识符:
output_statement : identifier (FORMAT column_format) ;
.....
identifier : IDENTIFIER | FORMAT ;
.....
FORMAT : 'format' ;
IDENTIFIER : [a-z]+ ;
.....
我 运行 在输入脚本中使用了我语法中的关键字,用户基本上可以在其中键入任何内容(例如变量名)。但是 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) ;
以下解析正确:
x = "a"
x format "str"
但是下一个输入文本没有解析:
format = "a"
format format "str"
test::script:1:0: 不匹配的输入 'format' 期待 EOF
有什么方法可以构造我的语法,以便 "format" 可以作为标识符吗?
谢谢。
由于 format
既是关键字又是标识符:
output_statement : identifier (FORMAT column_format) ;
.....
identifier : IDENTIFIER | FORMAT ;
.....
FORMAT : 'format' ;
IDENTIFIER : [a-z]+ ;
.....