问题标签 [bisonc++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
254 浏览

c++ - How to create a correct AST for my grammar (for optimization)?

I am making a compiler with flex, bisonc++ and gcc (in Ubuntu), which compile a simple esoteric programming language to c++ source code(I don't want to make assembly code). I want to make optimization as well, so I need an AST to do it.

I also have a symbol table, but I don't have any idea how to construct an AST properly and if I have a correct AST for the grammar, how to make code optimization (so I don't want just print the AST). My grammar (.y file) is full and correct (it recognize every syntax error).

It's clear that I have to write the action code of AST into the .y file, but I don't know what to read (I mentioned it also have syntax table), and where I should define my AST struct or class.

My files:

language.l (lex file where are the tokens) language.y (bisonc++ source file(the grammar of my language))

lex.yy.cc (it's generated by flex)

Those are generated by bisonc++: Parser.h (in this file, I added the symbol table, which is an std::map<std::string, var_data> where var_data is struct defined in semantics.h)

I have a language.cc file which containts the main fuction, it reads the input file (comand line argument) and starts the analysis. I also have a semantics.h header which contains structs for the symbol table.

0 投票
1 回答
42 浏览

bison - bison - 我可以通过引用传递非平凡的 YYSTYPE 吗?

例如,我在 .ypp 中有这个声明:

在“structs.h”中我有:

在“func.h”中我有这个函数:

我可以在 .ypp 中传递 $$ arg:

0 投票
1 回答
92 浏览

c - 为什么我会收到表达式评估程序的语法错误?

我尝试了以下输入

a = 10;

打印一个;

打印 1+2+3;

a = 5+10;

当我尝试使用上述输入执行文件时出现语法错误编译期间没有错误

这是代码

柔性

对于野牛,我们使用一个符号表,它是一个数组。我们获取变量(由 TOK_ID 表示的标识符)并将其转换为可以存储表达式值的索引。

野牛档案

/* 标记和类型 */ %start stmt

;

当我尝试使用输入 a=5 进行调试时;a = 5; 它可以捕获令牌 a ,但之后它会抛出语法错误它无法捕获 = 以及之后的所有内容。

我不知道为什么它只捕获第一个数字/命令/字符串然后抛出语法错误

0 投票
1 回答
62 浏览

c++ - Bison/flex 识别规则后等待输入

我有以下用于词法和句法分析的文件:

词典

sintactico.y

以下条目必须正确:mkdisk -size=20。大小规则的代码运行,但是,为了运行 instr 规则的代码,我必须按 CTRL + D。为什么会发生这种情况?代码中缺少什么?解析器是词法的还是句法的?

编辑:我从解析器中删除了 EOL 令牌。我不太明白的是,解析器如何知道条目已经完成?在控制台中输入 mkdisk -size = 20 命令后,按 ENTER 键。如何告诉 Bison 我的条目以 ENTER 结尾?为什么分析器要等待一个条目来完成分析?

0 投票
1 回答
93 浏览

c++ - C++解析器中的Bison %token-table替代品?

我正在学习Bison生成 C++ 解析器。

由于%token-table已过时,是否有任何替代方法可以从 c++ 解析器中的令牌整数值中获取名称?

0 投票
1 回答
441 浏览

c++ - Bison c++ 变体与 flex 可重入 c++14 示例?

我正在尝试用 c++14 中的 flex/bison 工具链编写我的玩具语言。

使用带有 flex reentrant 的 bison c++ 变体时我很困惑,yylex找不到参数yylval

我的开发环境是装有最新操作系统和 XCode 的 macbook,自制软件安装了最新的 flex 2.6.4 和 bison 3.7.1。

为方便起见,您可以在此处下载有错误的项目:https ://github.com/linrongbin16/tree 。

现在让我介绍这个不那么简单的tree项目:

首先让我们看看makefile

该应用程序是一个tree.out,它取决于 3 个组件:tree tokenparser.

树组件

tree.h定义了一个简单的抽象语法树类,由于我没有实现它,所以它只有一个虚拟析构函数:

tree.cpp是函数,它从lexer 和 parsermain读取文件名并初始化它,然后进行解析:stdin

重要的是,我使用 bison c++ 变体和 flex 可重入特性,我想让项目变得现代(使用 c++ 14)并且使用多线程安全。所以初始化的时候有点复杂。但是当项目扩大到一个大项目时,它是值得的。

词法分析器组件

token.l

在这里,我遵循了野牛拆分符号手册(注意:这里我们得到了编译错误,我也尝试了make_XXXapi,这也给了我错误)。

它生成token.yy.cc token.yy.hh,期望编译一个token.yy.o对象。

解析器组件

parser.y

我按照bison c++ 变体手册,它生成parser.tab.cc parser.tab.hh parser.output,输出文件仅供分析。

由于 flex 是可重入的,我需要添加一个参数%param {yyscan_t yyscanner}

错误信息

这是使用时的错误消息make tree.out

你能帮我解决这些问题吗?

0 投票
1 回答
195 浏览

c++ - 如何从 Bison c++ 变体中的 yy::parser::symbol_type 获取 yy::parser::token?

例如,我yy::parser::symbol_type通过以下方式返回 flex 规则:

我在野牛中定义的令牌在哪里ID,它将生成yy::parser::token结构。

现在我想为 flex 做一些单元测试token.l,当我调用该yy::parser::symbol_type yylex()函数时,我没有yy::parser::tokenBison c++ 变体手册yy::parser::symbol_type中看到任何 API 。

顺便说一句,在野牛手册中,建议yy::parser::symbol_type通过yy::parser::make_XXXflex 规则中的 API 返回。

还是没有这样的 API 来完成这项工作?我需要使用symbol_type.kind()API 来获得类似的东西yy::parser::symbol_type_kind::S_T_ID

0 投票
1 回答
525 浏览

compiler-construction - Bison 使用 %define api.pure full 没有 %union 而是使用 C++ 变体

我有一个手写扫描仪和一个可以解析这个句子的野牛解析器(使它成为问题上下文的缩写):

野牛:

scanner.get_next_token(lvalp)例如返回一个令牌INTEGER(包括 parser.tab.hppscanner.cpp并使用从令牌生成的枚举)。此外,在此之前,它会将正确的值放入lvalp诸如strcpy(lvalp->s, nextTokenString.c_str())lvalp->n = toInt(nextTokenString)......输出为:

但我想使用 STL 容器和智能指针。在这个关于纯调用的页面中,如果您的令牌类型不同,则没有说明如何在没有lvalp*联合的情况下使用。此外,根据这个页面,我应该使用接受语义类型而不是. 好吧,这会导致以下错误:%language "c++"%define api.value.type variantunion

parser.ypp:3.1-21: error: %define variable 'api.pure' is not used

所以我想在将正确的标记返回给解析器而不使用联合的同时分配值,以便我可以使用所有 C++ 功能。

注意:我看到了这个例子,但我还是不明白函数是make_Number已经存在还是已经生成了?如何从我的 next_token() 为属于已定义 %token 的 $ 变量添加值?

提前致谢。

0 投票
0 回答
57 浏览

bisonc++ - 在 Bison 的 C++ API 中覆盖 yylex()

我在 C++ 中有一个手写的解析器,其中包含一个next_token()方法,我想在里面使用它yylex()(我已经用 Bison 的 C API 正确地做到了这一点,但想使用动态类型,所以转移到了 C++)。我阅读了文档的这些部分,阅读了示例并尝试了两个现有签名,但仍然无法正确执行...

解析器.yy:

错误:

我也觉得很奇怪,即使没有覆盖,它似乎yylex也在这里使用(即使我不尝试覆盖也会导致错误出现):

我在这里做错了什么?提前致谢

0 投票
0 回答
205 浏览

c++ - 在 C++ 中使用 Flex 和 Bison 时如何设置 yylval

我在 C++ 中使用 Flex 和 Bison。在两者的 C 版本中,yylval 是一个全局联合变量,用于存储有关令牌的信息。

在 Bison C++ 中,yylval 被称为语义类型,它是一个类成员变量。如何为 Flex C++ 中的标记设置语义信息?在 Flex C++ 中,词法分析器也是一个类,它没有语义类型作为成员变量。

我想做这样的事情: