我试图创建一种简单的语言,它可以评估if/else if/else语句和一些带有预定义常量算术运算。定义如下:
语法测试;if声明: ifPart elseIfPart* elsePart;如果部分: 'if (' logicalExpression '( 则 ' retVal=basicElement;elseIfPart: ' else if (' logicalExpression '( 则 ' retVal=basicElement;其他部分: ' else ' retVal=basicElement;逻辑表达式: 逻辑表达式 ' 和 ' 逻辑表达式 #andLogicalExpression |逻辑表达式 ' 或 ' 逻辑表达式 #orLogicalExpression |比较表达式 #compareLogicalExpression |'(' 逻辑表达式 '(' #parensLogicalExpression;比较表达式: basicElement '' basicElement #gt |basicElement '=' basicElement #eq;基本元素: 操作 |原子元素;操作: 操作 op=('*'|'/'( 操作 #mulDiv | 操作操作 op=('+'|'-'( 操作 #addSub | 原子元素 #atomic | "("操作"("#operationParens;原子元素: 国际 #decimal |'resVal1' #reservedVariable |'resVal2' #reservedVariable;国际: [-]?[0-9]+('.'[0-9]+)?;WS: [ \t\r]+ -> 跳过;跳过空格、制表符、换行符
我生成了一个访问者并创建了一个测试句子,如下所示:
如果 (3+3=6 或 12*3=37( 则 10*10 否则 4+1
它返回 5,这是错误的。经过一些调试,我看到 visitOrLogicalExpression 方法从未被调用过,取而代之的是 visitCompareLogicalExpression 被调用了两次。我的语言定义有什么问题?
提前谢谢你!
语言定义还可以。我可以通过修改Visitor
类来解决上述问题。
在visitIfPart
和visitElseIfPart
方法(处理if
和else if
节点的子树(中,我必须将visitChildren(ctx.logicalExpression())
方法更改为visitLogicalExpression(ctx.logicalExpression())
,因此我的代码能够捕获复合逻辑表达式。