0
votes

I am trying to write a C grammar with Antlwork, and for that I used this one http://stuff.mit.edu/afs/athena/software/antlr_v3.2/examples-v3/java/C/C.g where I tried to make it more simple by removing many blocks I don't use and the backtracking. And here is what I have : http://www.archive-host.com/files/1956778/24fe084677d7655eb57ba66e1864081450017dd9/CNew.txt

Then when I do ctrl+D, I get a lot of warning and errors like these:

[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

I don't really understand why I have all these warnings, there should not be conflicts.

1
Then don't remove the backtrack (and memoize) options. - Bart Kiers
thanks for the reply, but a friend told me that using backtrack would cause me later many difficulties when I will try to do the AST. - Exia0890
You have 2 options here: 1) either rewrite the grammar so that the ambiguities are no longer there (which is probably quite hard, seeing you started with a grammar that had backtracking enabled), or 2) re-enable backtracking. Ask your friend what exactly s/he meant by "many difficulties when I will try to do the AST", because it sounds like non-sense. There's no problem creating an AST from a parser grammar that has backtracking enabled. - Bart Kiers
Having a lot of nodes shouldn't burden the parser, I wouldn't think. - Kyle Strand
@KyleStrand, the generated AST would not contain any more nodes whether backtracking is enabled or disabled. - Bart Kiers

1 Answers

1
votes

but I still have this error

[22:02:55] error(208): C:\Users\Seiya\Desktop\projets\TRAD\Gram\CNew.g:238:1: The following token definitions can never be matched because prior tokens match the same input: CONSTANT [22:17:18] error(208): CNew.g:251:1: The following token definitions can never be matched because prior tokens match the same input: CHAR [22:17:18] error(208): C:\Users\Seiya\Desktop\projets\TRAD\Gram\CNew.g:251:1: The following token definitions can never be matched because prior tokens match the same input: CHAR

That means the lexer can never create the tokens CHAR and INT because some other lexer rule, CONSTANT, matches the same input. What you need to do is change CONSTANT into a parser rule.

In other words, change these two rules:

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

CONSTANT
    :   INT
    |   CHAR
    ;

into the following:

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

constant
    :   INT
    |   CHAR
    ;