语句匹配后需要换行符或 EOF
Require newline or EOF after statement match
只是在寻找一种让 ANTLR4 生成解析器的简单方法,该解析器将执行以下操作(忽略 ;
之后的任何内容):
int #i ; defines an int
int #j ; see how I have to go to another line for another statement?
我的解析器如下:
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';
本质上,每当我有 statement
时,我都需要它在输入另一个之前需要一个换行符。我不在乎是否有 3 行新行,然后在第二行上仍然存在一堆选项卡,只要有新行即可。
问题是,ANTLR4 解析树似乎给我输入错误,例如:
.
(假装点不存在,实际上没有输入)
int #i int #j
糟糕,我们在同一条线上有两个!
关于如何实现此目标的任何想法?感谢您的帮助。
我稍微简化了您的语法,但在每个语句后都需要一个行尾序列才能正确解析。
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]
它也忽略分号后的内容,作为 EOL 令牌的一部分:
[@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]
使用换行符或回车换行符都可以。这就是您要找的吗?
编辑
根据 OP 评论,做了一个小改动以允许连续的 EOL 令牌,并将 EOL 令牌移动到 statement
以减少重复:
语法测试;
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;
只是在寻找一种让 ANTLR4 生成解析器的简单方法,该解析器将执行以下操作(忽略 ;
之后的任何内容):
int #i ; defines an int
int #j ; see how I have to go to another line for another statement?
我的解析器如下:
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';
本质上,每当我有 statement
时,我都需要它在输入另一个之前需要一个换行符。我不在乎是否有 3 行新行,然后在第二行上仍然存在一堆选项卡,只要有新行即可。
问题是,ANTLR4 解析树似乎给我输入错误,例如:
.
(假装点不存在,实际上没有输入)
int #i int #j
糟糕,我们在同一条线上有两个!
关于如何实现此目标的任何想法?感谢您的帮助。
我稍微简化了您的语法,但在每个语句后都需要一个行尾序列才能正确解析。
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]
它也忽略分号后的内容,作为 EOL 令牌的一部分:
[@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]
使用换行符或回车换行符都可以。这就是您要找的吗?
编辑
根据 OP 评论,做了一个小改动以允许连续的 EOL 令牌,并将 EOL 令牌移动到 statement
以减少重复:
语法测试;
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;