我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:
WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)
并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢
有人可以提供一个详细的例子,说明我如何使用antlr4做到这一点?安装antlr4及其依赖项的说明将受到高度赞赏.
我有一个ANTLR3语法,可以构建一个抽象语法树.我正在寻求升级到ANTLR4.但是,似乎ANTLR4只构建解析树而不是抽象语法树.例如,output=AST不再识别该选项.此外,"The Definitive ANTLR4 reference"的文本中既没有出现"AST"也没有出现"抽象语法".
我想知道我是否遗漏了什么.
我的应用程序目前知道如何爬行ANTLR3生成的AST.更改它以处理解析树并非不可能,但这将是一项工作.在我开始走这条路之前,我想确定它是必要的.
我为布尔表达式创建了一个语法,现在我正在尝试实现访问者来评估它.
有人告诉我,不需要使用语义分析来复杂语法词法分析器和解析器规则,因为从访问者那里提供有意义的错误消息要好得多.
所以我试图在访问者中检查类型一致性,日期正确性等.我得到的惊喜是没有办法(至少我没有看到它)报告来自访问者的错误而不是抛出异常.如果我抛出异常,我将无法继续进行表达式验证并立即检测所有错误.另外,我必须以某种方式捕获所有解析异常类型(我应该如何知道它们?).总而言之,异常抛出似乎不是正确的解决方案.
您能否指导我如何计划在访问者遍历期间报告表达式语义中的错误?
有没有办法让ANTLR4自动删除生成的解析树中的冗余节点?
更具体地说,我一直在试验GLSL的语法,并且由于规则转发需要自动处理运算符优先级,因此在解析树中最终会出现长线性的"表达式"序列.
大多数生成的树节点只是"转发到下一级优先级",因此不提供任何有用的语法信息 - 您只需要每个序列中的最后一个表达式节点(即规则转发停止的点)或者它成为具有多个子节点的实际树节点的点(即在源中遇到实际表达式)...
我希望有一种简单的方法来消除虚拟中间表达式节点 - 这种类型的结构必须在具有运算符优先级的任何语法中都是通用的.
语法的基本结构是从Khronos语言规范中获得的相当直接的克隆:
https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
我正在写一个求解方程的求解方法.该方法将是递归的; 搜索所有外括号并在找到时调用求解括号内的值,并在未找到括号时返回该值.
这个过程应该是这样的
20 * (6+3) / ((4+6)*9)
20 * 9 / ((4+6)*9)
20 * 9 / (10*9)
20 * 9 / 90
2
Run Code Online (Sandbox Code Playgroud)
如您所见,每场比赛可能有不同的替换值.我需要将括号替换为它的计算结果.有没有办法做到这一点.这是我到目前为止所拥有的.
public int solve(string etq)
{
Regex rgx = new Regex(@"\(([^()]|(?R))*\)");
MatchCollection matches;
matches = rgx.Matches(etq);
foreach(Match m in matches){
//replace m in etq with unique value here
}
//calculations here
return calculation
}
Run Code Online (Sandbox Code Playgroud)
Regex.replace(...)替换所有出现的指定模式.我希望能够匹配多个场景并用不同的输出替换每个场景