相关疑难解决方法(0)

是否有可用于8位嵌入式系统的flex/bison的替代方案?

我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.

如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?

embedded parsing bison avr-gcc flex-lexer

80
推荐指数
3
解决办法
6万
查看次数

抽象语法树和具体语法树有什么区别?

我一直在阅读有关解释器/编译器如何工作的一些内容,而我感到困惑的一个领域是AST和CST之间的区别.我的理解是解析器生成一个CST,将它交给语义分析器,将其转换为AST.但是,我的理解是语义分析器只是确保遵循规则.我真的不明白为什么它会实际做出任何改变,使其变得抽象而不是具体.

有没有关于语义分析器的东西,或者AST和CST之间的差异有点人为?

parsing terminology abstract-syntax-tree semantic-analysis concrete-syntax-tree

74
推荐指数
6
解决办法
3万
查看次数

如何构造抽象语法树

我对AST是什么有一个大概,但我想知道如何构建一个.

如果给你一个语法和一个解析树,你如何构建AST?

如果给你一个语法和表达,你怎么做?

abstract-syntax-tree

64
推荐指数
2
解决办法
5万
查看次数

如何用ANTLR4创建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

58
推荐指数
2
解决办法
3万
查看次数

如何在C++中使用简单的递归下降解析器解析基本算术(例如"5 + 5")?

这已经在我脑海中浮现了一段时间.我对递归下降解析器很感兴趣,并且想知道如何实现它.我想要的是一个简单的解析器,它将理解简单的算术,如"5 + 5"或"(5 + 5)*3".

我认为第一步是编写一个'tokenizer',它获取整个输入字符串并将其分解为许多子字符串.这部分我已经完成了(我甚至不得不在这里询问.如果你不想,你不必关注链接,因为我也在这里发布了相关代码.)使用这个标记器我的,我结束了一个vectorstringS,或令牌.现在,困难的部分:我想解析那些令牌.

我已经阅读了关于递归下降解析器维基百科文章.我确实理解整体概念,但一如既往,实施有点令人困惑.在那篇文章中,有一个非常简单的编程语言的递归下降解析器的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)

c++ parsing recursive-descent tokenize

15
推荐指数
1
解决办法
2945
查看次数

如何创建允许语法错误的AST解析器?

首先,阅读有关解析和构建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

6
推荐指数
1
解决办法
1551
查看次数

如何使用 Javascript 将字符串转换为 AST 对象?

我需要将字符串转换为遵守特定语法规则的对象(类似 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

5
推荐指数
1
解决办法
1369
查看次数