问题标签 [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.
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.
bison - bison - 我可以通过引用传递非平凡的 YYSTYPE 吗?
例如,我在 .ypp 中有这个声明:
在“structs.h”中我有:
在“func.h”中我有这个函数:
我可以在 .ypp 中传递 $$ arg:
c - 为什么我会收到表达式评估程序的语法错误?
我尝试了以下输入
a = 10;
打印一个;
打印 1+2+3;
a = 5+10;
当我尝试使用上述输入执行文件时出现语法错误编译期间没有错误
这是代码
柔性
对于野牛,我们使用一个符号表,它是一个数组。我们获取变量(由 TOK_ID 表示的标识符)并将其转换为可以存储表达式值的索引。
野牛档案
/* 标记和类型 */ %start stmt
;
当我尝试使用输入 a=5 进行调试时;a = 5; 它可以捕获令牌 a ,但之后它会抛出语法错误它无法捕获 = 以及之后的所有内容。
我不知道为什么它只捕获第一个数字/命令/字符串然后抛出语法错误
c++ - Bison/flex 识别规则后等待输入
我有以下用于词法和句法分析的文件:
词典
sintactico.y
以下条目必须正确:mkdisk -size=20。大小规则的代码运行,但是,为了运行 instr 规则的代码,我必须按 CTRL + D。为什么会发生这种情况?代码中缺少什么?解析器是词法的还是句法的?
编辑:我从解析器中删除了 EOL 令牌。我不太明白的是,解析器如何知道条目已经完成?在控制台中输入 mkdisk -size = 20 命令后,按 ENTER 键。如何告诉 Bison 我的条目以 ENTER 结尾?为什么分析器要等待一个条目来完成分析?
c++ - C++解析器中的Bison %token-table替代品?
我正在学习Bison生成 C++ 解析器。
由于%token-table
已过时,是否有任何替代方法可以从 c++ 解析器中的令牌整数值中获取名称?
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
token
和parser
.
树组件
tree.h
定义了一个简单的抽象语法树类,由于我没有实现它,所以它只有一个虚拟析构函数:
tree.cpp
是函数,它从lexer 和 parsermain
读取文件名并初始化它,然后进行解析:stdin
重要的是,我使用 bison c++ 变体和 flex 可重入特性,我想让项目变得现代(使用 c++ 14)并且使用多线程安全。所以初始化的时候有点复杂。但是当项目扩大到一个大项目时,它是值得的。
词法分析器组件
token.l
:
在这里,我遵循了野牛拆分符号手册(注意:这里我们得到了编译错误,我也尝试了make_XXX
api,这也给了我错误)。
它生成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
:
你能帮我解决这些问题吗?
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::token
在Bison c++ 变体手册yy::parser::symbol_type
中看到任何 API 。
顺便说一句,在野牛手册中,建议yy::parser::symbol_type
通过yy::parser::make_XXX
flex 规则中的 API 返回。
还是没有这样的 API 来完成这项工作?我需要使用symbol_type.kind()
API 来获得类似的东西yy::parser::symbol_type_kind::S_T_ID
?
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 variant
union
parser.ypp:3.1-21: error: %define variable 'api.pure' is not used
所以我想在将正确的标记返回给解析器而不使用联合的同时分配值,以便我可以使用所有 C++ 功能。
注意:我看到了这个例子,但我还是不明白函数是make_Number
已经存在还是已经生成了?如何从我的 next_token() 为属于已定义 %token 的 $ 变量添加值?
提前致谢。
bisonc++ - 在 Bison 的 C++ API 中覆盖 yylex()
我在 C++ 中有一个手写的解析器,其中包含一个next_token()
方法,我想在里面使用它yylex()
(我已经用 Bison 的 C API 正确地做到了这一点,但想使用动态类型,所以转移到了 C++)。我阅读了文档的这些部分,阅读了示例并尝试了两个现有签名,但仍然无法正确执行...
解析器.yy:
错误:
我也觉得很奇怪,即使没有覆盖,它似乎yylex
也在这里使用(即使我不尝试覆盖也会导致错误出现):
我在这里做错了什么?提前致谢
c++ - 在 C++ 中使用 Flex 和 Bison 时如何设置 yylval
我在 C++ 中使用 Flex 和 Bison。在两者的 C 版本中,yylval 是一个全局联合变量,用于存储有关令牌的信息。
在 Bison C++ 中,yylval 被称为语义类型,它是一个类成员变量。如何为 Flex C++ 中的标记设置语义信息?在 Flex C++ 中,词法分析器也是一个类,它没有语义类型作为成员变量。
我想做这样的事情: