我的C语法有很多多种替代错误

时间:2013-03-06 20:28:05

标签: c antlr grammar rule

我正在尝试用Antlwork编写一个C语法,为此我使用了这个http://stuff.mit.edu/afs/athena/software/antlr_v3.2/examples-v3/java/C/C.g,我尝试通过删除许多我不使用的块和回溯来使其变得更简单。这就是我所拥有的:http://www.archive-host.com/files/1956778/24fe084677d7655eb57ba66e1864081450017dd9/CNew.txt

然后当我按ctrl + D时,我会收到很多警告和错误,如下所示:

[21:20:54] warning(200): C:\CNew.g:188:2:  Decision can match input such as "'{' '}'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[21:20:54] warning(200): C:\CNew.g:210:2: Decision can match input such as "'for' '('" using multiple alternatives: 2, 3
As a result, alternative(s) 3 were disabled for that input
[21:20:54] error(201): C:\CNew.g:210:2: The following alternatives can never be matched: 3

[21:20:54] error(208): C:\CNew.g:250:1: The following token definitions can never be matched because prior tokens match the same input: CHAR

我真的不明白为什么我会收到所有这些警告,不应该有冲突。

1 个答案:

答案 0 :(得分:1)

  

但我仍有此错误

     

[22:02:55]错误(208):C:\ Users \ Seiya \ Desktop \ projets \ TRAD \ Gram \ CNew.g:238:1:以下令牌定义永远无法匹配,因为之前的令牌匹配相同的输入:CONSTANT [22:17:18]错误(208):CNew.g:251:1:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入:CHAR [22:17:18]错误(208):C:\ Users \ Seiya \ Desktop \ projets \ TRAD \ Gram \ CNew.g:251:1:永远不能匹配以下标记定义,因为先前的标记匹配相同的输入:CHAR

这意味着词法分析器永远不能创建标记CHARINT,因为其他词法分析器CONSTANT匹配相同的输入。您需要做的是将CONSTANT更改为解析器规则。

换句话说,改变这两条规则:

primary_expression
    : ID
    | CONSTANT
    | '(' expression ')'
    ;

CONSTANT
    :   INT
    |   CHAR
    ;

进入以下内容:

primary_expression
    : ID
    | constant
    | '(' expression ')'
    ;

constant
    :   INT
    |   CHAR
    ;