2013-03-06 15 views
0

我想写一个C语法与Antlwork,并为此我使用这一个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许多多种替代错误与我的C语法

后来,当我做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 

我真的不明白,为什么我有这些警示,不应该有冲突。

+0

那就不要删除'backtrack'(和'memoize')选项。 – 2013-03-06 20:46:44

+0

感谢您的回复,但有朋友告诉我,使用回溯会让我后来遇到很多困难,当我尝试执行AST时。 – Exia0890 2013-03-06 20:50:41

+2

这里有两个选项:'1)'要么重写语法,以便模糊不再存在(这可能相当困难,看到您开始使用启用了回溯的语法),或者2)重新启用回溯。询问你的朋友究竟是什么意思*“当我尝试做AST时会遇到很多困难”*,因为这听起来像是无意义的。从启用回溯的语法分析器语法创建AST没有任何问题。 – 2013-03-06 20:58:32

回答

1

但我仍然有此错误

[22时02分55秒]的错误(208):C:\用户\星矢\桌面\ projets \ TRAD \革兰氏\ 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 
    ; 
+0

谢谢,但是这是否意味着在词法分析器规则定义中不能使用另一个?这里是我有什么http://我。imgur.com/7EnFgRu.jpg 在左边我有一个红色的子树,我想这意味着有歧义。在((external_declaration)+行的下方,“;” caractere是红色的。它不好吗? – Exia0890 2013-03-06 21:48:58

+1

@Exia0890,是的,词法分析器规则可以使用另一个词法分析器规则。但是,如何设置它,词法分析器永远不会创建'INT'和'CHAR'标记,因为会创建一个'CONSTANT' ** always **。你必须为解析器规则(后者更合适,因此我的建议)制作INT和CHAR碎片规则,或者将“CONSTANT”“提升”。请参阅:http://stackoverflow.com/questions/6487593/what-does-fragment-means-in-antlr – 2013-03-06 21:55:38

+0

图像中的红色是解析器放弃的(部分)解析,因为它无法完成解析。解析器从'function_definition'规则中回溯以匹配'声明'规则。 – 2013-03-06 21:57:58