Существует еще одна неопределенность, которая также нуждается в исправлении.Измените:
program : statement* | function*;
на:
program : (statement | function)*;
(хотя 2 не эквивалентны, я полагаю, вы хотите последнее)
И в вашем function
правиле вы теперь определили, что по крайней мере 2 statement
s:
function : ID '(' args ')' '->' statement (','statement)+ '.' ;
, хотя я предполагаю, что вы действительно хотите по крайней мере один:
function : ID '(' args ')' '->' statement (','statement)* '.' ;
Теперь ваша реальная проблема: поскольку вы создаете числа с плавающей точкой в правиле синтаксического анализатора, с конца вашего ввода, 10001.
, анализатор пытается создать number
из него, в то время как вы хотите, чтобы он соответствовалINTEGER
, а затем .
, как вы уже сказали в своем ОП.
Чтобы исправить это, вам нужно дать парсеру немного дополнительного упреждения, чтобы «увидеть» за пределами этой двусмысленности.Сделайте это, добавив предикат (INTEGER '.' INTEGER)=>
перед фактическим сопоставлением указанного ввода:
number
: HEX_NUMBER
| (INTEGER '.' INTEGER)=> INTEGER '.' INTEGER
| INTEGER
;
Теперь ваш ввод сгенерирует следующее дерево разбора:
![enter image description here](https://i.stack.imgur.com/Vasgh.png)