Я пытаюсь определить простую функциональную грамматику языка, я почти закончил свои определения, но я не могу преодолеть следующие неясности.
[14:43:53] warning(200): mygrammar.g:14:11: Decision can match input such as "ATOM" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input
[14:43:53] warning(200): mygrammar.g:14:11: Decision can match input such as "ID" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input
вот, что я думаю, соответствующие правила, чертеж почти идентичен для ATOM и ID:
program : (statement'.')* ;
statement : assignment
| expression;
assignment : func '->' statement ((','statement)=> ',' statement)*
| ID '->' expression
| ATOM '->' ( string | number );
func : (ID '(' args ')')=> ID '(' args ')';
term : func
| '(' expression ')'
| number
| string
| ID
| ATOM ;
ATOM : ('A'..'Z'|'_')+;
ID : ('a'..'z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
вот дерево синтаксиса из ANTLRWorks
альтернативные идентификаторы http://www.vertigrated.com/images/id_alternatives.png
Вот грубый соломенный человек того, что я пытаюсь поддержать при разборе.
hypotenuse(a,b) ->
sqr(x) -> x * x,
sqr(sqr(a) + sqr(b)).
print(hypotnenuse(2,3)).
поэтому я должен иметь возможность поддерживать вложенность statements
внутри functions
где ->
- мой оператор присваивания, это один язык присваивания
где .
- маркер конца моего заявления
Возможно ли даже разобрать ANTLR3?