Token with different interpretations (i.e. keyword

2019-02-28 22:30发布

问题:

I am writing a grammar with a lot of case-insensitive keywords in ANTLR4. I collected some example files for the format, that I try to test parse and some use the same tokens which exist as keywords as identifiers in other places. For example there is a CORE keyword, which in other places is used as a ID for a structure from user input. Here some parts of my grammar:

fragment A : [aA]; // match either an 'a' or 'A'
fragment B : [bB];
fragment C : [cC];
[...]
CORE:        C O R E ;
[...]
IDSTRING:    [a-zA-Z_] [a-zA-Z0-9_]*;
id:          IDSTRING ;

The error thrown then is line 7982:8 mismatched input 'core' expecting IDSTRING, as the user input is intended as IDSTRING, but always eaten by the keyword rule. In the input it exists both as keyword and as id like this:

MACRO oa12f01
    CLASS CORE ; #here it is a KEYWORD
[...]
SITE core ; #here it is a ID

Is there a way I can let users use some keywords as identifiers by changing my grammar somehow like "casting" the token to IDSTRING for conjunctive rules like this or is this a false hope in not hand written parsers?

回答1:

You can simply list the keywords that are allowed as identifiers as alternatives in the id rule:

id: IDSTRING | CORE | ... ;