Разбор в фортранском стиле .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;