Analysieren von fortran-style .op. Betreiber

Ich versuche, eine ANTLR4-Grammatik für ein fortran-inspiriertes DSL zu schreiben. Ich habe Probleme mit dem alten Klassiker ".op". Betreiber:

if (1.and.1) then

wobei beide "1" als ganze Zahl interpretiert werden sollen. Ich habe mir den OpenFortranParser angesehen, um einen Einblick zu erhalten, aber ich kann keinen Sinn daraus ziehen.

Anfangs hatte ich passende Definitionen für INTEGER und REAL in meinem Lexer. Folglich wurde die erste "1" oben immer als ECHT geparst, egal was ich versuchte. Ich habe versucht, Dinge in den Parser zu verschieben, und habe es so weit gebracht, dass ich das ".and" zuverlässig erkennen konnte. zusammen mit Zahlen um ihn herum als angemessen INTEGER oder REAL.

if (1.and.1)   # INT/INT
if (1..and..1) # REAL/REAL

...usw...

Ich möchte natürlich Variablennamen in solchen Anweisungen erkennen:

if (a.and.b)

und haben eine geeignete Regel für die ID. In der folgenden kleinen Grammatik werden jedoch Literale in Anführungszeichen (ex, 'und', 'if', alle numerischen Einzelzeichensuffixe) nicht als ID akzeptiert, und es wird eine Fehlermeldung angezeigt. Jede andere ID-konforme Zeichenfolge wird akzeptiert:

if (a.and.b)  # errs, as 'b' is valid INTEGER suffix
if (a.and.c)  # OK

Beliebige Einblicke in dieses Verhalten oder bessere Vorschläge zum Parsen der .op-Datei. betreiber in fortran wären sehr dankbar - danke!

grammar Foo;

start  : ('if' expr | ID)+ ;

DOT : '.' ;

DIGITS: [0-9]+;

ID : [a-zA-Z0-9][a-zA-Z0-9_]* ;

andOp : DOT 'and' DOT ;

SIGN : [+-];

expr     
    : ID
    | expr andOp expr
    | numeric
    | '(' expr ')'
    ;

integer : DIGITS ('q'|'Q'|'l'|'L'|'h'|'H'|'b'|'B'|'i'|'I')? ;

real    
    : DIGITS DOT DIGITS? (('e'|'E') SIGN? DIGITS)? ('d' | 'D')?
    |        DOT DIGITS  (('e'|'E') SIGN? DIGITS)? ('d' | 'D')?
    ;

numeric : integer | real;

EOLN  : '\r'? '\n' -> skip;

WS    :  [ \t]+ -> skip;   

Antworten auf die Frage(1)

Ihre Antwort auf die Frage