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还是我做错了什么?

Antlr中可能存在C#生成错误

您可以使用命令轻松地使此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中没有错误:)