Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
令牌识别错误:antlr_Antlr_Grammar_Antlr4_Lexer_Antlrworks2 - Fatal编程技术网

令牌识别错误:antlr

令牌识别错误: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

我有一个ANTLR 4语法:

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