Разбор в фортранском стиле .op. операторы

Я пытаюсь написать грамматику ANTLR4 для DSL, вдохновленного фортраном. У меня возникли трудности с классическим «Оле». операторы:

if (1.and.1) then

где оба «1» следует интерпретировать как целое число. Я посмотрел на OpenFortranParser для понимания, но не могу понять из этого.

Первоначально у меня были подходящие определения для INTEGER и REAL в моем лексере. Следовательно, первое «1» выше всегда анализировалось как РЕАЛЬНОЕ, независимо от того, что я пытался. Я попытался переместить вещи в синтаксический анализатор и довел его до такой степени, что я смог надежно распознать «.and». наряду с числами вокруг него как соответственно INTEGER или REAL.

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

...так далее...

Я, конечно, хочу распознавать имена переменных в таких утверждениях:

if (a.and.b)

и иметь соответствующее правило для ID. Однако в приведенной ниже небольшой грамматике любые литералы в кавычках (например, 'и', 'если', все односимвольные числовые суффиксы) не принимаются в качестве идентификатора, и я получаю ошибку; допускается любая другая строка, соответствующая ID:

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

Любое понимание этого поведения или лучшие предложения о том, как разобрать .op. Операторы в Фортране будут высоко оценены - спасибо!

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;   

Ответы на вопрос(1)

Ваш ответ на вопрос