令牌识别错误:antlr
我有一个ANTLR 4语法:令牌识别错误:antlr,antlr,grammar,antlr4,lexer,antlrworks2,Antlr,Grammar,Antlr4,Lexer,Antlrworks2,我有一个ANTLR 4语法: grammar Test; start : NonZeroDigit '.' Digit Digit? EOF ; DOT : '.' ; PLUS : '+' ; MINUS : '-' ; COLON : ':' ; COMMA : ',' ; QUOTE : '\"' ; EQUALS
grammar Test;
start : NonZeroDigit '.' Digit Digit? EOF
;
DOT : '.' ;
PLUS : '+' ;
MINUS : '-' ;
COLON : ':' ;
COMMA : ',' ;
QUOTE : '\"' ;
EQUALS : '=' ;
SEMICOLON : ';' ;
UNDERLINE : '_' ;
BACKSLASH : '\\' ;
SINGLEQUOTE : '\'' ;
RESULT_TYPE_NONE : 'NONE' ;
RESULT_TYPE_RESULT : 'RESULT' ;
RESULT_TYPE_RESULT_SET : 'RESULT_SET' ;
TYPE_INT : 'Int' ;
TYPE_LONG : 'Long' ;
TYPE_BOOL : 'Bool' ;
TYPE_DATE : 'Date' ;
TYPE_DOUBLE : 'Double' ;
TYPE_STRING : 'String' ;
TYPE_INT_LIST : 'List<Int>' ;
TYPE_LONG_LIST : 'List<Long>' ;
TYPE_BOOL_LIST : 'List<Bool>' ;
TYPE_DATE_LIST : 'List<Date>' ;
TYPE_DOUBLE_LIST : 'List<Double>' ;
TYPE_STRING_LIST : 'List<String>' ;
LONG_END : 'L' ;
DOUBLE_END : 'd' ;
DATE_NOW : 'NOW' ;
BOOL_TRUE : 'true' ;
BOOL_FALSE : 'false' ;
BLOCK_OPEN : '{' ;
BLOCK_CLOSE : '}' ;
GENERIC_OPEN : '<' ;
GENERIC_CLOSE : '>' ;
BRACKET_OPEN : '(' ;
BRACKET_CLOSE : ')' ;
MAP : 'Map' ;
LIST : 'List' ;
GROUP : 'Group' ;
BY : 'by' ;
DEFAULT : 'default' ;
JSON_NAME : 'JSONName' ;
INTERFACE : 'interface' ;
CLASS : 'class' ;
ABSTRACT : 'abstract' ;
IMPLEMENTS : 'implements' ;
EXTENDS : 'extends' ;
CACHEABLE : 'cacheable' ;
FUNCTION : 'function' ;
REQUEST : 'request' ;
NAMED_QUERY : 'namedQuery' ;
INPUT : 'input' ;
OUTPUT : 'output' ;
RESULT_TYPE : 'resultType' ;
PACKAGE : 'package' ;
SCHEMA : 'schema' ;
VERSION : 'version' ;
MIN_VERSION : 'minVersion' ;
fragment
NonZeroDigit : [1-9]
;
fragment
Digit : '0' | NonZeroDigit
;
fragment
Digits : Digit+
;
fragment
IntegerNumber : '0' | ( NonZeroDigit Digits? )
;
fragment
SignedIntegerNumber : ( '+' | '-' )? IntegerNumber
;
fragment
FloatingNumber : IntegerNumber ( '.' Digits )?
;
fragment
SignedFloatingNumber : ( '+' | '-' )? FloatingNumber
;
fragment
Letter : [a-z]
;
fragment
Letters : Letter+
;
fragment
CapitalLetter : [A-Z]
;
fragment
CapitalLetters : CapitalLetter+
;
fragment
LetterOrDigitOrUnderline : Letter | CapitalLetter | Digit | '_'
;
fragment
EscapeSequence : ( '\\' ( 'b' | 't' | 'n' | 'f' | 'r' | '\"' | '\'' | '\\' ) )
| UnicodeEscape
| OctalEscape
;
fragment
HexDigit : [0-9] | [a-f] | [A-F]
;
fragment
UnicodeEscape : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
;
fragment
OctalEscape : ( '\\' [0-3] [0-7] [0-7] )
| ( '\\' [0-7] [0-7] )
| ( '\\' [0-7] )
;
WS : [ \t\r\n]+ -> skip
;
但这给了我:
line 1:0 token recognition error at: '1'
line 1:2 token recognition error at: '1'
line 1:3 token recognition error at: '1'
line 1:1 missing NonZeroDigit at '.'
line 1:4 missing Digit at '<EOF>'
行1:0令牌识别错误位于:“1”
第1行:2“1”处的令牌识别错误
第1行:3“1”处的令牌识别错误
第1行:“.”处缺少非零数字
第1行:4“”处缺少数字
我做错了什么?我正在使用antlr v4.1
提前感谢您的帮助。
fragment
lexer规则只能由其他lexer规则使用:这些规则本身永远不会成为令牌。因此,您不能在解析器规则中使用片段
规则。片段不是根本原因
首先,尝试重现您的错误: 编译Test.g4时,将出现以下警告:
warning(156): Test.g4:11:21: invalid escape sequence \"
warning(156): Test.g4:123:59: invalid escape sequence \"
warning(146): Test.g4:11:0: non-fragment lexer rule QUOTE can match the empty string
warning(125): Test.g4:3:8: implicit definition of token NonZeroDigit in parser
warning(125): Test.g4:3:25: implicit definition of token Digit in parser
删除未使用的规则后:
语法测试;
开始:非零位“.”位?EOF
;
片段
非零位:[1-9]
;
片段
数字:“0”|非零数字
;
然后再次编译并测试它:
warning(125): Test.g4:3:8: implicit definition of token NonZeroDigit in parser
warning(125): Test.g4:3:25: implicit definition of token Digit in parser
line 1:0 token recognition error at: '1'
line 1:2 token recognition error at: '1'
line 1:3 token recognition error at: '1'
line 1:1 missing NonZeroDigit at '.'
line 1:4 missing Digit at '<EOF>'
(start <missing NonZeroDigit> . <missing Digit> <EOF>)
将
数字
替换为('0'|[1-9])
但是解析器规则start
(标识符以小写字母开头)不能都是字母
请参阅第73页的最终ANTLR 4参考 lexer规则名称使用大写字母,解析器规则名称使用大写字母 小写字母。例如,ID是词法规则名称,expr是 解析器规则名称
删除“片段”后 从g4中删除“fragment”后,仍然存在意外错误
line 1:3 extraneous input '3' expecting {<EOF>, Digit}
(start 1 . 0 3 <EOF>)
因为[1-9]
是一个字母(常量标记)。我们需要用大写前缀来命名它。(=lexer规则)
对于数字
:
它包含一个标识符
非零位
,因此我们需要用小写前缀命名它。(=解析器规则)
正确的测试方法。g4应为:
语法测试;
开始:非零位“.”位?EOF
;
非零位:[1-9]
;
数字:“0”|非零数字
;
如果要使用
fragment
,应该创建一个lexer规则Number
,因为该规则只包含字母(常量标记)。标识符应该以大写前缀开头,start
不是
语法测试;
开始编号:EOF
;
数字:非零位“.”位?
;
片段
非零位:[1-9]
;
片段
数字:“0”|非零数字
;
grammar Test;
start : [1-9] '.' Digit Digit? EOF
;
fragment
Digit : '0' | [1-9]
;
grammar Test;
start : [1-9] '.' ('0' | [1-9]) ('0' | [1-9])? EOF
;
line 1:3 extraneous input '3' expecting {<EOF>, Digit}
(start 1 . 0 3 <EOF>)
syntax error: '1-9' came as a complete surprise to me while matching alternative