Parsing 语句匹配后需要换行符或EOF

Parsing 语句匹配后需要换行符或EOF,parsing,antlr4,semantics,Parsing,Antlr4,Semantics,只需寻找一种简单的方法,让ANTLR4生成一个解析器,该解析器将执行以下操作(忽略之后的任何内容;): 我的解析器如下所示: compilationUnit: (statement END?)* statement END? EOF ; statement: intdef | WS ; // 10 - 1F block. intdef: 'intdef' Identifier ; // Lexer. Identifier: '#' Let

只需寻找一种简单的方法,让ANTLR4生成一个解析器,该解析器将执行以下操作(忽略
之后的任何内容;
):

我的解析器如下所示:

compilationUnit:
    (statement END?)*
    statement END?
    EOF
;

statement:
    intdef |
    WS
;

// 10 - 1F block.

intdef:
    'intdef' Identifier
;

// Lexer.

Identifier: '#' Letter LetterOrDigit*;
fragment Letter: [a-zA-Z_];
fragment LetterOrDigit: [a-zA-Z0-9$_];

// Whitespace, fragments and terminals.

WS: [ \t\r\n\u000C]+ -> skip;
//COMMENT: '/*' .*? '*/' -> channel(HIDDEN);
END: (';' ~[\r\n]*) | '\n';
本质上,每当我有一个
语句
,我都需要它在输入另一个语句之前要求换行。我不在乎是否有3行新行,然后在第二行上有一堆标签,只要有一行新行

问题是,ANTLR4解析树似乎给了我输入错误,例如:

.
(假设点不在那里,它实际上没有输入)

哇,我们有两个在同一条线上


有什么办法可以做到这一点吗?非常感谢您的帮助。

我简化了您的语法,但要求在每条语句后都有一个行尾序列,以便正确解析

grammar Testnl;

program: (statement )* EOF ;

statement: 'int' Identifier EOL;

Identifier: '#' Letter LetterOrDigit*;
fragment Letter: [a-zA-Z_];
fragment LetterOrDigit: [a-zA-Z0-9$_];

EOL: ';' .*? '\r\n'
| ';' .*? '\n'
;

WS: [ \t\r\n\u000C]+ -> skip;
它解析

int #i ;
int #j;


[@0,0:2='int',<'int'>,1:0]
[@1,4:5='#i',<Identifier>,1:4]
[@2,7:9=';\r\n',<EOL>,1:7]
[@3,10:12='int',<'int'>,2:0]
[@4,14:15='#j',<Identifier>,2:4]
[@5,16:18=';\r\n',<EOL>,2:6]
[@6,19:18='<EOF>',<EOF>,3:0]

我简化了一点语法,但要求在每条语句后都有一个行尾序列,以便正确解析

grammar Testnl;

program: (statement )* EOF ;

statement: 'int' Identifier EOL;

Identifier: '#' Letter LetterOrDigit*;
fragment Letter: [a-zA-Z_];
fragment LetterOrDigit: [a-zA-Z0-9$_];

EOL: ';' .*? '\r\n'
| ';' .*? '\n'
;

WS: [ \t\r\n\u000C]+ -> skip;
它解析

int #i ;
int #j;


[@0,0:2='int',<'int'>,1:0]
[@1,4:5='#i',<Identifier>,1:4]
[@2,7:9=';\r\n',<EOL>,1:7]
[@3,10:12='int',<'int'>,2:0]
[@4,14:15='#j',<Identifier>,2:4]
[@5,16:18=';\r\n',<EOL>,2:6]
[@6,19:18='<EOF>',<EOF>,3:0]

谢谢你的回答!这正是我想要的。事实上,快速提问,有没有办法让我在语句之间和最后一个语句之后换行?目前,它们必须紧跟在一起插入,没有多余的换行符。@finnrayment当然,完成了,请参见上面编辑的语法。干杯非常感谢!如果可以,我会再次投票。(非常感谢。)谢谢你的回答!这正是我想要的。事实上,快速提问,有没有办法让我在语句之间和最后一个语句之后换行?目前,它们必须紧跟在一起插入,没有多余的换行符。@finnrayment当然,完成了,请参见上面编辑的语法。干杯非常感谢!如果可以,我会再次投票。(非常感谢。)
[@0,0:2='int',<'int'>,1:0]
[@1,4:5='#i',<Identifier>,1:4]
[@2,7:20='; ignore this\n',<EOL>,1:7]
[@3,21:23='int',<'int'>,2:0]
[@4,25:26='#j',<Identifier>,2:4]
[@5,27:28=';\n',<EOL>,2:6]
[@6,29:28='<EOF>',<EOF>,3:0]
program: ( statement EOL )* EOF ;

statement: 'int' Identifier;

Identifier: '#' Letter LetterOrDigit*;
fragment Letter: [a-zA-Z_];
fragment LetterOrDigit: [a-zA-Z0-9$_];

EOL: ';' .*? ('\r\n')+
| ';' .*? ('\n')+
;

WS: [ \t\r\n\u000C]+ -> skip;