ANTLR4 getCharPositionInLine () не работает, как предполагалось в правиле LEXER - PullRequest
0 голосов
/ 21 сентября 2018

ANTLR Grammer:

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 Input:

     FFILENAMEIF  E           K        DISK
     FFILENA01UF  E           K        DISK

В файлах RPG, которые я пытаюсь проанализировать, есть спецификации, которые можно найти, посмотрев на символ встолбец 6 строки.Если в столбце 6 есть буква «F», это означает, что это спецификация описания файла, а следующие 8 символов - это имя файла.Я пытаюсь извлечь имя файла в правиле синтаксического анализатора f_content, используя правило лексера F_CONTENT.

Ожидаемый результат здесь - это то, что правило лексера F_CONTENT совпадает только тогда, когда последовательность начинается в позиции 6 (столбец 7) RPG.файл, таким образом извлекая столбцы 7 - 14, которые зарезервированы для имени файла.Фактический вывод заключается в том, что имя файла извлекается, но затем для следующих 8 символов оно также соответствует F_CONTENT, то есть getCharPositionInLine () не применяется должным образом.

У меня также есть getCharPositionInLine () в правиле лексера SPEC_START, но это не работает и в других случаях, когда предоставляется полный код (он соответствует последовательностям, которые находятся в середине строки длиной 30 символов).

...