Antlr中可能存在C#生成错误
本文关键字:错误 存在 Antlr | 更新日期: 2023-09-27 18:00:28
使用Antlr 4.3和此语法
http://www.harward.us/~nharward/antlr/OracleNetServicesV3.g
生成以下C#的Lexer.cs代码:
private void WHITESPACE_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 1: skip(); break;
}
}
private void NEWLINE_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 2: skip(); break;
}
}
private void COMMENT_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 0: skip(); break;
}
}
但是运行时中的方法skip()被定义为:
public virtual void Skip()
这当然会导致编译错误。
Antlr 3.5.2也生成了相同的skip()方法。
这是bug还是我做错了什么?
您可以使用命令轻松地使此v4兼容并独立于语言
-> channel(HIDDEN)
以下是实现此更改的更新语法
configuration_file
: ( parameter )*
;
parameter
: keyword EQUALS ( value
| LEFT_PAREN value_list RIGHT_PAREN
| ( LEFT_PAREN parameter RIGHT_PAREN )+
)
;
keyword
: WORD
;
value
: WORD
| QUOTED_STRING
;
value_list
: value ( COMMA value )*
;
QUOTED_STRING
: SINGLE_QUOTE ~''''* SINGLE_QUOTE
| DOUBLE_QUOTE ~'"'* DOUBLE_QUOTE
;
WORD
: ( 'A' .. 'Z'
| 'a' .. 'z'
| '0' .. '9'
| '<'
| '>'
| '/'
| '.'
| ':'
| ';'
| '-'
| '_'
| '$'
| '+'
| '*'
| '&'
| '!'
| '%'
| '?'
| '@'
| '''' .
)+
;
LEFT_PAREN
: '('
;
RIGHT_PAREN
: ')'
;
EQUALS
: '='
;
COMMA
: ','
;
SINGLE_QUOTE
: ''''
;
DOUBLE_QUOTE
: '"'
;
COMMENT
: '#' ( ~( ''n' ) )* -> channel(HIDDEN)
;
WHITESPACE
: ( ''t'
| ' '
) -> channel(HIDDEN)
;
NEWLINE
: ( ''r' )? ''n' -> channel(HIDDEN)
;
正如我在评论中所写的,这是因为auf语法文件中的skip(),它依赖于Java。
因此Antlr中没有错误:)