Я попытался создать простой язык, который может оценивать операторы if / else if / else и некоторые арифметические операции с предопределенными константами. Определение следующее:
grammar test; ifStatement : ifPart elseIfPart* elsePart ; ifPart : 'if (' logicalExpression ') then ' retVal=basicElement ; elseIfPart : ' else if (' logicalExpression ') then ' retVal=basicElement ; elsePart : ' else ' retVal=basicElement ; logicalExpression : logicalExpression ' and ' logicalExpression #andLogicalExpression |logicalExpression ' or ' logicalExpression #orLogicalExpression | compareExpression #compareLogicalExpression | '(' logicalExpression ')' #parensLogicalExpression ; compareExpression : basicElement '' basicElement #gt | basicElement '=' basicElement #eq ; basicElement : operation | atomicElement ; operation : operation op=('*'|'/') operation #mulDiv | operation op=('+'|'-') operation #addSub | atomicElement #atomic | '(' operation ')' #operationParens ; atomicElement : INT #decimal | 'resVal1' #reservedVariable | 'resVal2' #reservedVariable ; INT : [-]?[0-9]+('.'[0-9]+)? ; WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Я создал посетителя и создал тестовое предложение, которое выглядит следующим образом:
if (3+3=6 or 12*3=37) then 10*10 else 4+1
Он возвращает 5, что неверно. После некоторой отладки я увидел, что метод visitOrLogicalExpression никогда не вызывается, вместо него дважды вызывается visitCompareLogicalExpression. Что не так с моим определением языка?
Заранее спасибо!
' else if ('
просто неправильны. Это должно быть 3 токена:'else'
,'if'
и'('
. - person Bart Kiers   schedule 17.12.2014