1

我正面临一个奇怪的 ANTLR 问题,它应该只输出一个 AST。

       grammar ltxt.g;

options
{
    language=CSharp3;
}


prog    : start
    ;

start       :   '{Start 'loopname'}'statement'{Ende 'loopname'}'
        |   statement
        ;

loopname    :   (('a'..'z')|('A'..'Z')|('1'..'9'))*;
statement   :   '<%' table_ref '>'
        |   start;

table_ref   :   '{'format'}'ID;

format      :   FSTRING 
        |   FSTRING OFSTRING{0,5}
        ;
FSTRING :   '#F'
    |   '#D'
    |   '#U'
    |   '#K'
    ;

OFSTRING:   'F'
    |   'D'
    |   'U'
    |   'K'
    //| 1..65536
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;


WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

当我尝试编码生成时,我得到了

  • 错误(100):LTXT.g:1:13:语法错误:antlr:MismatchedTokenException(74!= 52)。我没有声明任何 74 或 52。
  • 我也没有得到 Synatx 图,因为无法找到“规则“开始””作为开始状态......

我知道这并不漂亮,但我认为它至少会起作用:)

最好的,希望

4

1 回答 1

2

我看到了四个错误。

  • 语法名称不能包含句点。这就是您遇到的语法错误。错误消息是一个提示,74!=52告诉您 ANTLR 在期望令牌 id 52 时发现了令牌 id 74,在这种情况下,它只是转换为“它在期望其他东西时发现了一件事”。
  • 语法名称(“ltxt”)和扩展名之前的文件名(“LTXT”)需要完全匹配。
  • output=AST;除非您在该options部分中指定,否则该语法不会产生 AST 。
  • format的第二个选择 ( FSTRING OFSTRING{0,5}) 不会做我认为你认为它会做的事情。ANTLR 不支持任意数量的匹配,例如“匹配零到五个OFSTRINGs”。您需要使用为您计算出现次数的语义谓词重新定义规则。它们并不难使用,但它们是 ANTLR 中比较棘手的部分之一。

我希望这可以帮助您入门。

于 2012-12-11T19:10:38.773 回答