antlr 我怎样才能跳过令牌直到我需要它
antlr how can I skip a token until I need it
有没有办法跳过令牌直到我需要它们?为了更清楚,这里有一个尽可能接近我想要的语法:
grammar example;
file : statement* EOF ;
statement : ID EOL
| '{' (EOL statement*)? '}' EOL
;
EOL : ('\r'? '\n' | '\r') -> skip ;
WHITESPACE : [ \t]+ -> skip ;
希望我的意图很明确:在正常情况下会跳过所有空格(包括换行符),但我可以随时要求出现换行符,所以
foo
{
bar
}
baz
符合语法,但不符合
foo {
bar
} baz
或
foo bar
{
baz
}
有没有办法做到这一点,还是我只需要在我的语法中加入很多 EOL*
?
不久前我回答了另一个需要同类机制的问题
有关详细信息,请参阅 here。
基本上,您可以通过提供自己的自定义 TokenStream
来实现此目的,该自定义 TokenStream
实现了一种机制,即跳过空格或将其输入解析器,具体取决于它的设置。
有没有办法跳过令牌直到我需要它们?为了更清楚,这里有一个尽可能接近我想要的语法:
grammar example;
file : statement* EOF ;
statement : ID EOL
| '{' (EOL statement*)? '}' EOL
;
EOL : ('\r'? '\n' | '\r') -> skip ;
WHITESPACE : [ \t]+ -> skip ;
希望我的意图很明确:在正常情况下会跳过所有空格(包括换行符),但我可以随时要求出现换行符,所以
foo
{
bar
}
baz
符合语法,但不符合
foo {
bar
} baz
或
foo bar
{
baz
}
有没有办法做到这一点,还是我只需要在我的语法中加入很多 EOL*
?
不久前我回答了另一个需要同类机制的问题
有关详细信息,请参阅 here。
基本上,您可以通过提供自己的自定义 TokenStream
来实现此目的,该自定义 TokenStream
实现了一种机制,即跳过空格或将其输入解析器,具体取决于它的设置。