Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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
Java ANTLR4 getCharPositionInLine()未按LEXER规则中的预期工作_Java_Antlr_Antlr4_Rpgle_Rpg - Fatal编程技术网

Java ANTLR4 getCharPositionInLine()未按LEXER规则中的预期工作

Java ANTLR4 getCharPositionInLine()未按LEXER规则中的预期工作,java,antlr,antlr4,rpgle,rpg,Java,Antlr,Antlr4,Rpgle,Rpg,ANTLR语法: grammar Test; /* * Parser Rules */ rpg_file : f_section EOF? ; f_section : f_line* ; f_line : f_start f_content f_end ; f_start

ANTLR语法:

grammar Test;

/*
 * Parser Rules
 */
rpg_file                    : f_section
                              EOF? ;

f_section                   : f_line* ;

f_line                      : f_start f_content f_end ;

f_start                     : F_START ;
f_content                   : F_CONTENT ;
f_end                       : ANYTHING_BUT_NL* NEWLINE;

/*
 * Lexer Rules
 */
fragment F                  : ('F' | 'f') ;
fragment LOWERCASE          : [a-z] ;
fragment UPPERCASE          : [A-Z] ;
fragment DIGIT              : [0-9] ;
fragment CHAR               : (LOWERCASE | UPPERCASE) ;
fragment DIGIT_CHAR         : (DIGIT | CHAR) ;

fragment WHITESPACE         : (' ' | '\t') ;
fragment WS_OR_TEXT         : (WHITESPACE | DIGIT_CHAR) ;

fragment F_FILENAME         : WS_OR_TEXT?
                              WS_OR_TEXT?
                              WS_OR_TEXT?
                              WS_OR_TEXT?
                              WS_OR_TEXT?
                              WS_OR_TEXT?
                              WS_OR_TEXT? ;

/*
 * First 5 characters in RPG format are unused and should be ignored
 */
fragment SPEC_START        : {getCharPositionInLine() == 0}?
                             ANYTHING_BUT_NL
                             ANYTHING_BUT_NL
                             ANYTHING_BUT_NL
                             ANYTHING_BUT_NL
                             ANYTHING_BUT_NL ;

F_START                     : SPEC_START F ;
F_CONTENT                   : {getCharPositionInLine() == 6}? CHAR F_FILENAME ;

ANYTHING_BUT_NL             : ~('\n' | '\r') ;
NEWLINE                     : ('\r'? '\n' | '\r') ;
ANTLR输入:

     FFILENAMEIF  E           K        DISK
     FFILENA01UF  E           K        DISK
在我试图解析的RPG文件中,有一些规范是通过查看一行第6列中的字符找到的。如果第6列中有“F”,则表示它是文件描述规范,以下8个字符是文件名。我正在尝试使用f_content lexer规则提取f_content parser规则中的文件名

这里的预期输出是F_内容lexer规则仅在序列从RPG文件的位置6(第7列)开始时匹配,从而提取为文件名保留的第7-14列。实际输出是提取文件名,但随后对于接下来的8个字符,它也与F_内容匹配,这意味着getCharPositionInLine()未按预期应用


我在SPEC_START lexer规则中也有getCharPositionInLine(),但在提供完整代码的其他情况下也不起作用(它与中第30行字符中间的序列相匹配)。

请看一下github上基于ANTLR4的rpgleparser。