如何处理antlr4访问者中的无序分配?

如何处理antlr4访问者中的无序分配?,antlr4,context-free-grammar,Antlr4,Context Free Grammar,我有一个简单的antlr4语法,它处理将变量赋值给文本和或运算符(用于递归规则)。当任务有序时,我的访问者可以正常工作(示例A),但当任务不有序时,访问者会失败(示例B)。如何使示例B也起作用?也许我需要某种双过程方法,其中变量在第一个过程中创建,在第二个过程中解析?谢谢 示例A(工程) 示例B(失败,$foo在第1行中未定义) 假设您的输入完全由一系列赋值和返回值组成(特别是我将假设赋值之间不会有任何副作用操作),您可以通过从结果表达式开始执行深度优先搜索来解析这样一个代码块的值。要做到这一点

我有一个简单的antlr4语法,它处理将变量赋值给文本和或运算符(用于递归规则)。当任务有序时,我的访问者可以正常工作(示例A),但当任务不有序时,访问者会失败(示例B)。如何使示例B也起作用?也许我需要某种双过程方法,其中变量在第一个过程中创建,在第二个过程中解析?谢谢

示例A(工程)

示例B(失败,$foo在第1行中未定义)


假设您的输入完全由一系列赋值和返回值组成(特别是我将假设赋值之间不会有任何副作用操作),您可以通过从结果表达式开始执行深度优先搜索来解析这样一个代码块的值。要做到这一点,您确实需要使用如下两个阶段:

  • 检查赋值并创建从变量名到表达式的映射
  • 使用映射递归计算表达式中出现的变量,从而递归计算结果表达式。如果在执行此操作时遇到循环,则意味着输入中存在无限递归

  • 实际上,有一些递归案例需要处理(我已经更新了示例)。如果我错了,请纠正我,但这是一个基本的上下文无关语法,具有递归规则,应该能够使用antlr进行解析和运行?@rednoyz如果您解析的是语法,而不是我假设的语句序列,那么您的访问者可能也不会执行任何操作,而是构建某种中间结构,对的在这种情况下,我需要知道这个结构是什么样的,以便理解为什么规则失灵甚至是一个问题,以及如何解决这个问题。或者更一般地说,我需要看看你的访问者当前做了什么,以及当看到一个以前没有定义过的非终端时,它是如何遇到问题的。我试图只将语法“编译”到解析树中,然后使用访问者对其进行评估,但是可能需要一个中间结构,像你一样suggest@rednoyz“求值”是指用该语法解析给定的输入?你不可能一次通过语法的AST就做到这一点。您需要选择一个能够解析上下文无关语法(或其适当子集)的算法,然后使用访问者构建该算法所需的任何数据结构(如下推自动机或ll表)。如果你想实现一个递归下降解析器,你实际上可以使用我在回答中概述的方法,只要你只计算一个函数的右边,或者如果左边不匹配。。。。。。请注意,递归下降无法处理左递归,因此您仍然必须在
    $foo=$foo或$bar
    $foo=$foo'foo'或$bar
    上出错,但类似于
    $foo='foo'$foo或$bar
    的东西可以正常工作。
    $bar='happiness';
    $foo='baz' $foo OR $bar;
    $start=$foo;
    
    $start // outcome is 'happiness' repeated one or more times
    
    $start=$foo;
    $foo='baz' $foo OR $bar;
    $bar='happiness'; 
    
    $start