ANTLR4 语法不识别 bool 文字

标签 antlr4

为什么下面的语法不能识别 bool 值?

我已经将其与 Java 和 GraphQL 的语法进行了比较,但不明白为什么它不起作用。

给定以下语法,解析如下:

foo = null // foo = value:nullValue
foo = 123 // foo = value:numberValue
foo = "Hello" // foo = value:stringValue
foo = true // line 1:6 mismatched input 'true' expecting {'null', STRING, BOOLEAN, NUMBER}

怎么了?

grammar issue;

elementValuePair
    :   Identifier '=' value
    ;

Identifier : [_A-Za-z] [_0-9A-Za-z]* ;

value
   : STRING # stringValue | NUMBER # numberValue | BOOLEAN # booleanValue | 'null' #nullValue
   ;

STRING
   : '"' ( ESC | ~ ["\\] )* '"'
   ;

BOOLEAN
   : 'true' | 'false'
   ;

NUMBER
   : '-'? INT '.' [0-9]+| '-'? INT | '-'? INT
   ;

fragment INT
   : '0' | [1-9] [0-9]*
   ;

fragment ESC
   : '\\' ( ["\\/bfnrt]  )
   ;

fragment HEX
   : [0-9a-fA-F]
   ;

WS
   : [ \t\n\r]+ -> skip
   ;

最佳答案

它不起作用,因为标记“true”匹配词法分析器规则标识符:

[@0,0:2='foo',<Identifier>,1:0]
[@1,4:4='=',<'='>,1:4]
[@2,6:9='true',<Identifier>,1:6] <== lexed as an Identifier!
[@3,14:13='<EOF>',<EOF>,3:0]
line 1:6 mismatched input 'true' expecting {'null', STRING, BOOLEAN, NUMBER}

将您对标识符的定义向下移动到词法分析器规则中并且它有效:

NUMBER
   : '-'? INT '.' [0-9]+| '-'? INT | '-'? INT
   ;

Identifier : [_A-Za-z] [_0-9A-Za-z]* ;

记住顶部的东西胜过底部的东西。在像您这样的组合语法中,不要将词法分析器规则(以大写字母开头)与解析器规则(以小写字母开头)穿插。

关于ANTLR4 语法不识别 bool 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196412/

相关文章:

antlr4 - antlr4 sql语法

java - ANTLR 4 - 如何从自定义监听器访问隐藏的评论 channel ?

java - ANTLR4 : Can't get Python ANTLR to generate a graphic of the parse tree

antlr - 是否有任何资源为 excel 函数提供 ANTLR 语法?

java - 如何抓取antlr4错误输出?

java - 有没有办法让 ANTLR4 使用枚举来生成 token ?

java - 判断字符串是否符合ANTLR4语法

java - 是否可以将 ANTLR 语法配置为使用具有相同结构的两个标记?

java - 在 Eclipse Luna (4.4) 上设置 ANTLR 4 IDE 时遇到问题

python - 导入后ANTLR4语法标记识别错误