无关的输入 '<EOF>' 期望 {, '} - Antlr4

  • 本文关键字:期望 Antlr4 EOF java antlr4
  • 更新时间 :
  • 英文 :


我有一个文本文件,我通过antlr4解析。

文本格式

  TEST OFFICE
  98 KINGS STREET
DATE     18/05/22                                                FORT,ABC
ABC HOTEL PLC
CFA 843                                                         PAGE                1
NO 40 DUTCH BUILDING
PARK ROAD HALL
KINGS STREET 01                                                ACCOUNT NO          5XX75YY200
2128 100                                                         CURRENCY            USD
BALANCE AS OF  17MAY22                                                                     1,115.75
18MAY22 CLOSING BALANCE                                                                            1,115.75
TOTAL DEPOSITS       0 ITEMS                                             .00
TOTAL WITHDRAWALS    0 ITEMS                     .00

语法规则

// Define a grammar called CustomValidation
grammar CustomValidation;  
@header {
package grammar ;
}
init : statement+ ;
statement : detail+ ;
detail : content+ ;
content : id ;
id : (WORD | NUMBER | SIGNS)* ('r'|'n')+ ;
WORD : LETTER+ ;
NUMBER : DIGIT+ ;
SIGNS : SIGN+ ;
WHITESPACE : ( 't' | ' ' )+ -> skip ;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment SIGN : ('.'|'+'|'('|')'|'/'|','|'-'|'&'|'''|':'|'#'|'_'|'*'|';'|'%'|'@'|'"'|'`') ;
fragment DIGIT : ('0'..'9') ;

我得到这个

Error -> line 36127:63 extraneous input '<EOF>' expecting {'
', '
', WORD, NUMBER, SIGNS}

我做错了什么,我怎样才能使这些规则更好?

如果您从init规则开始,您的示例输入将得到正确解析:

String source = "                                                                        TEST OFFICEn" +
"                                                                        98 KINGS STREETn" +
"       DATE     18/05/22                                                FORT,ABCn" +
"       ABC HOTEL PLCn" +
"       CFA 843                                                         PAGE                1n" +
"       NO 40 DUTCH BUILDINGn" +
"       PARK ROAD HALLn" +
"       KINGS STREET 01                                                ACCOUNT NO          5XX75YY200n" +
"       2128 100                                                         CURRENCY            USDn" +
"           BALANCE AS OF  17MAY22                                                                     1,115.75n" +
"   18MAY22 CLOSING BALANCE                                                                            1,115.75n" +
"           TOTAL DEPOSITS       0 ITEMS                                             .00n" +
"           TOTAL WITHDRAWALS    0 ITEMS                     .00n";
CustomValidationLexer lexer = new CustomValidationLexer(CharStreams.fromString(source));
CustomValidationParser parser = new CustomValidationParser(new CommonTokenStream(lexer));
ParseTree root = parser.init();
System.out.println(root.toStringTree(parser));

打印:

(init (statement (detail (content (id TEST OFFICE n)) (content (id 98 KINGS STREET n)) (content (id DATE 18 / 05 / 22 FORT , ABC n)) (content (id ABC HOTEL PLC n)) (content (id CFA 843 PAGE 1 n)) (content (id NO 40 DUTCH BUILDING n)) (content (id PARK ROAD HALL n)) (content (id KINGS STREET 01 ACCOUNT NO 5 XX 75 YY 200 n)) (content (id 2128 100 CURRENCY USD n)) (content (id BALANCE AS OF 17 MAY 22 1 , 115 . 75 n)) (content (id 18 MAY 22 CLOSING BALANCE 1 , 115 . 75 n)) (content (id TOTAL DEPOSITS 0 ITEMS . 00 n)) (content (id TOTAL WITHDRAWALS 0 ITEMS . 00 n)))))

看起来像这样缩进:

(init 
(statement 
(detail 
(content 
(id TEST OFFICE n)) 
(content 
(id 98 KINGS STREET n))
(content 
(id DATE 18 / 05 / 22 FORT , ABC n))
(content 
(id ABC HOTEL PLC n))
(content 
(id CFA 843 PAGE 1 n)) 
(content 
(id NO 40 DUTCH BUILDING n))
(content 
(id PARK ROAD HALL n))
(content 
(id KINGS STREET 01 ACCOUNT NO 5 XX 75 YY 200 n))
(content 
(id 2128 100 CURRENCY USD n))
(content 
(id BALANCE AS OF 17 MAY 22 1 , 115 . 75 n))
(content 
(id 18 MAY 22 CLOSING BALANCE 1 , 115 . 75 n))
(content 
(id TOTAL DEPOSITS 0 ITEMS . 00 n))
(content 
(id TOTAL WITHDRAWALS 0 ITEMS . 00 n)))))

我猜你得到的错误是由语法生成的解析器产生的,语法看起来与你现在发布的语法不同。每次更改语法时,都需要让ANTLR生成新的词法分析器和解析器类。

最新更新