为什么下面的语法不能识别布尔值?
我已经将它与 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}
Run Code Online (Sandbox Code Playgroud)
怎么了?
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
;
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为标记“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}
Run Code Online (Sandbox Code Playgroud)
将您对 Identifier 的定义进一步移到词法分析器规则中,它可以工作:
NUMBER
: '-'? INT '.' [0-9]+| '-'? INT | '-'? INT
;
Identifier : [_A-Za-z] [_0-9A-Za-z]* ;
Run Code Online (Sandbox Code Playgroud)
记住顶部的东西胜过底部的东西。在像您这样的组合语法中,不要将词法分析器规则(以大写字母开头)与解析器规则(以小写字母开头)散布。
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |