Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTLR4语法不';无法识别布尔文字_Antlr4 - Fatal编程技术网

ANTLR4语法不';无法识别布尔文字

ANTLR4语法不';无法识别布尔文字,antlr4,Antlr4,为什么下面的语法不能识别布尔值 我将其与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', STRI

为什么下面的语法不能识别布尔值

我将其与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”与lexer规则标识符匹配:

[@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}

记住顶部的东西胜过底部的东西。在像您这样的组合语法中,不要将lexer规则(以大写字母开头)与parser规则(以小写字母开头)混在一起。

请记住,lexer首先尝试最长的匹配。如果
BOOLEAN
匹配的输入比
Identifier
规则可以匹配的任何输入都多,则lexer将选择
BOOLEAN
。例如,您可以使用谓词限制
标识符
匹配的字符数(对于
false
true
),然后语法将按原样匹配这些关键字。谢谢@MikeLischke和true。然而,OP将词法规则作为语法中的第二条规则进行了非正统的混合,这是他所描述的问题的根本原因。我以前也遇到过类似的问题,简单地在-tokens模式下运行TestRig给了我一个“哈哈”的时刻。是的,这是一个非常常见的问题。
NUMBER
   : '-'? INT '.' [0-9]+| '-'? INT | '-'? INT
   ;

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