[antlr-interest] Bug report: Unexplainable "no viable alternative"
David-Sarah Hopwood
david-sarah at jacaranda.org
Wed Nov 4 13:52:04 PST 2009
alex.marin at amiq.ro wrote:
> Hello,
>
> We have trouble understanding why we get a "no viable alternative" when
> running the attached parser grammar on the following input:
>
> bit bitstream [];
>
> The output is:
>
> line 1:15 no viable alternative at input ']'
>
> However, we have found two (very strange) workarounds for the issue:
> 1. Commenting out the 'real' option in the data_type rule
> 2. Using associative_dimension_2 rule instead of associative_dimension_1
> (although the two are equivalent)
>
> What is the explanation for this behavior?
The problem is the k=1 option. If that is deleted, and neither workaround
is needed. Also delete the redundant syntactic predicate in
<variable_dimension>.
The grammar is not LL(1), because a two-token lookahead is needed to
distinguish between <associative_dimension> and (the first of a sequence of)
<sized_or_unsized_dimension>.
The reason why you didn't get a warning about the too-small k value is
that the use of a syntactic predicate in <variable_dimension> caused the
warning to be suppressed. The syntactic predicate is not necessary because
<associative_dimension> and <sized_or_unsized_dimension> are not mutually
ambiguous.
Removing the predicate (still with k=1) would have given the warning:
[21:36:45] warning(200): Example.g:43:1: Decision can match input such
as "LBRACK" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
which is correct since one-token lookahead is not sufficient in rule
<variable_dimension>.
> Is there a rigorous solution to avoid such behavior?
In general, the k option is rarely if ever necessary. When k is too small,
it can often be the case that apparently equivalent rules cause different
behaviour. This is because ANTLR uses different strategies for lookahead
based on considerations that are fairly unpredictable, and the k value
has different effects on these strategies. (IMHO this should be made
clearer in the documentation; arguably, the statements that k simply causes
ANTLR to use LL(k) parsing are misleadingly incomplete.)
You should also avoid redundant predicates, since they often suppress
useful warnings.
--
David-Sarah Hopwood ⚥ http://davidsarah.livejournal.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 292 bytes
Desc: OpenPGP digital signature
Url : http://www.antlr.org/pipermail/antlr-interest/attachments/20091104/6124f14e/attachment.bin
More information about the antlr-interest
mailing list