从不调用 Antlr 访问者方法



我试图创建一种简单的语言,它可以评估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类来解决上述问题。

visitIfPartvisitElseIfPart方法(处理ifelse if节点的子树(中,我必须将visitChildren(ctx.logicalExpression())方法更改为visitLogicalExpression(ctx.logicalExpression()),因此我的代码能够捕获复合逻辑表达式。

相关内容

  • 没有找到相关文章

最新更新