我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
我一直在阅读有关解释器/编译器如何工作的一些内容,而我感到困惑的一个领域是AST和CST之间的区别.我的理解是解析器生成一个CST,将它交给语义分析器,将其转换为AST.但是,我的理解是语义分析器只是确保遵循规则.我真的不明白为什么它会实际做出任何改变,使其变得抽象而不是具体.
有没有关于语义分析器的东西,或者AST和CST之间的差异有点人为?
parsing terminology abstract-syntax-tree semantic-analysis concrete-syntax-tree
我对AST是什么有一个大概,但我想知道如何构建一个.
如果给你一个语法和一个解析树,你如何构建AST?
如果给你一个语法和表达,你怎么做?
我一直在寻找很多关于这一点,我找不到任何有用的,真正帮助我建立一个AST.我已经知道ANTLR4不像以前的ANTLR3那样构建AST.每个人都说:"嘿,使用访客!",但我找不到任何示例或更详细的解释如何我这样做...
我的语法必须像C一样,但每个命令都用葡萄牙语(portuga编程语言)编写.我可以使用ANTLR4轻松生成解析树.我的问题是:现在我需要做些什么才能创建AST?
顺便说一下,我正在使用Java和IntelliJ ......
EDIT1:我能得到的最接近的是使用本主题的答案:是否有一个使用antlr4从java源代码创建AST并提取方法,变量和注释的简单示例? 但它只打印访问过的方法的名称..
由于第一次尝试对我不起作用,我试图使用ANTLR3中的这个教程,但我无法弄清楚如何使用StringTamplate而不是ST ...
阅读本书The Definitive ANTLR 4 Reference我也找不到任何与AST有关的内容.
EDIT2:现在我有一个类来创建DOT文件,我只需要弄清楚如何正确使用访问者
java compiler-construction antlr abstract-syntax-tree antlr4
这已经在我脑海中浮现了一段时间.我对递归下降解析器很感兴趣,并且想知道如何实现它.我想要的是一个简单的解析器,它将理解简单的算术,如"5 + 5"或"(5 + 5)*3".
我认为第一步是编写一个'tokenizer',它获取整个输入字符串并将其分解为许多子字符串.这部分我已经完成了(我甚至不得不在这里询问.如果你不想,你不必关注链接,因为我也在这里发布了相关代码.)使用这个标记器我的,我结束了一个vector的stringS,或令牌.现在,困难的部分:我想解析那些令牌.
我已经阅读了关于递归下降解析器的维基百科文章.我确实理解整体概念,但一如既往,实施有点令人困惑.在那篇文章中,有一个非常简单的编程语言的递归下降解析器的C实现,也在本文中讨论过.我尽可能地研究了这段代码,并尝试基本上写同样的东西,但对于我的程序.以下是该代码.
我真正困惑的是这个解析器的作用.它似乎通过该程序并"期望"语法的某些部分.但一旦到达那里,它会做什么?例如,以下是维基百科代码中应该解析"术语"的一个函数:
void term(void) {
factor();
while (sym == times || sym == slash) {
getsym();
factor();
}
}
Run Code Online (Sandbox Code Playgroud)
这是为了解析这个语法:
term = factor {("*"|"/") factor} .
Run Code Online (Sandbox Code Playgroud)
这是有道理的.但它与实际用语有什么关系呢?假设这个术语只是"6",或者是"3*2"并且有价值6.如何将其纳入其余的输入?不应该term()返回一个double而不是void(返回6)?或者是以其他方式完成的?
另外,将这样的解析器输出到输出代码并立即对输入进行操作(即编译器与解释器)之间的区别是什么?这两个(至少在这个例子中)理论上是以相同的方式实现的,还是它们根本不同?
欢迎任何输入.这是我到目前为止的代码:
#include <iostream>
#include <string>
#include <vector>
#include <ctype.h>
#include <sstream>
using namespace std;
vector<string> symbolize(string);
bool accept(string);
void getSymbol();
void error(string s);
bool expect(string);
void expression();
void term();
void …Run Code Online (Sandbox Code Playgroud) 首先,阅读有关解析和构建AST的内容?
如何为将构建AST并允许语法错误的语言(如SQL)创建解析器?
例如,对于"3 + 4*5":
+
/ \
3 *
/ \
4 5
Run Code Online (Sandbox Code Playgroud)
对于语法错误的"3 + 4*+",解析器会猜测用户的意思是:
+
/ \
3 *
/ \
4 +
/ \
? ?
Run Code Online (Sandbox Code Playgroud)
从哪儿开始?
SQL:
SELECT_________________
/ \ \
. FROM JOIN
/ \ | / \
a city_name people address ON
|
=______________
/ \
.____ .
/ \ / \
p address_id a id
Run Code Online (Sandbox Code Playgroud) language-agnostic compiler-construction algorithm abstract-syntax-tree
我需要将字符串转换为遵守特定语法规则的对象(类似 AST)。
我基本上有3种表达方式('@', '$' and '#')。'#'类型的表达式写为,#something而其他两个写为@something==somethingelse和$something==somethingelse。
这些表达式可以使用连词 ( 'and', 'or') 进行分组,并且可以使用括号修改运算顺序。
下面是一个完整表达式的示例:
const expression =
`#buy
&& (@car == white || @bike == blue)
&& $user==authenticated`;
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种使用 javascript 或基于 javascript 的工具(将在 React 项目中使用)将其转换为对象(类似 AST)的方法。
const ast = {
type: 'expression',
conjunction: 'null',
expressions: [{
type: 'expression',
conjunction: null,
expressions: [{
type: '#',
left: 'buy',
operator: null,
right: null
}]
},
{
type: 'expression',
conjunction: '&&',
expressions: [{
type: 'expression',
conjunction: 'null', …Run Code Online (Sandbox Code Playgroud) javascript compiler-construction parsing abstract-syntax-tree
parsing ×4
algorithm ×1
antlr ×1
antlr4 ×1
avr-gcc ×1
bison ×1
c++ ×1
embedded ×1
flex-lexer ×1
java ×1
javascript ×1
terminology ×1
tokenize ×1