我过去曾经使用过lex和yacc(更常见的是bison)用于各种项目,通常是翻译(例如EDIF的子集流入EDA应用程序).另外,我必须支持基于几十年前的lex/yacc语法的代码.所以我知道我的工具,虽然我不是专家.
我在过去的各种论坛上看过关于Antlr的积极评论,我很好奇我可能会缺少什么.因此,如果您同时使用了两者,请告诉我Antlr中哪些更好或更先进.我目前的限制是我在C++商店工作,我们发布的任何产品都不包含Java,因此生成的解析器必须遵循该规则.
Flex&Lex和Yacc&Bison有什么区别.我疯狂地搜索了互联网,但没有找到任何可靠的答案.
我可以在Ubuntu上安装纯Lex和Yacc,或者我只能安装flex和bison.我很迷惑.
如果Lex不是免费的,为什么我要在我的Ubuntu发行版上安装它?
lex --version
lex 2.5.35
Run Code Online (Sandbox Code Playgroud)我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
我在Visual Studio中编译了我的bison生成的文件并得到了以下错误:
...\_ position.hh(83):错误C2589:'(':'::'
...\_ position.hh(83)右侧的非法令牌:错误C2059:语法错误:'::'
. ..\_ position.hh(83):错误C2589:'(':'::'
...\_ position.hh(83)右侧的非法令牌:错误C2059:语法错误:'::'
相应的代码是:
inline void columns (int count = 1)
{
column = std::max (1u, column + count);
}
Run Code Online (Sandbox Code Playgroud)
我认为问题出在std :: max; 如果我将std :: max更改为等效代码,那么就没有问题了,但有没有更好的解决方案而不是更改生成的代码?
这是我写的野牛文件:
//
// bison.yy
//
%skeleton "lalr1.cc"
%require "2.4.2"
%defines
%define parser_class_name "cmd_parser"
%locations
%debug
%error-verbose
%code requires {
class ParserDriver;
}
%parse-param { ParserDriver& driver }
%lex-param { ParserDriver& driver }
%union {
struct ast *a;
double d;
struct symbol *s;
struct symlist *sl;
int …
Run Code Online (Sandbox Code Playgroud) 我想使用flex/bison解析器创建一个read-eval-print循环.麻烦的是,flex生成的词法分析器需要输入FILE*类型,我希望它是char*.反正有没有这样做?
一个建议是创建一个管道,将其提供给字符串并打开文件描述符并发送给词法分析器.这很简单,但感觉很复杂,而且与平台无关.有没有更好的办法?
我有Lex
和YACC
文件来解析我的文件(.l
文件和.y
文件).
如何编译这些文件以及如何.c
在Windows平台上为它们创建等效文件?
在此文件上运行Bison:
%{
#include <iostream>
int yylex();
void yyerror(const char*);
%}
%union
{
char name[100];
int val;
}
%token NUM ID
%right '='
%left '+' '-'
%left '*'
%%
exp : NUM {$$.val = $1.val;}
| ID {$$.val = vars[$1.name];}
| exp '+' exp {$$.val = $1.val + $3.val;}
| ID '=' exp {$$.val = vars[$1.name] = $3.val;}
;
%%
Run Code Online (Sandbox Code Playgroud)
导致出现以下类型的警告:
警告:'exp'的$$没有声明的类型.
它是什么意思,我该如何解决?
我正在尝试构建gcc 4.6,但是我收到了一些链接器错误,看起来这意味着bison或flex没有被链接到.当makefile发出以下命令时:
gcc -g -fkeep-inline-functions -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wold-style-definition -Wc++-compat -fno-common -DHAVE_CONFIG_H -DGENERATOR_FILE -o build/gengtype \
build/gengtype.o build/errors.o build/gengtype-lex.o build/gengtype-parse.o build/version.o ../../build-x86_64-unknown-linux-gnu/libiberty/libiberty.a
Run Code Online (Sandbox Code Playgroud)
它告诉我:
/home/chris/code/gcc/trunk/host-x86_64-unknown-linux-gnu/gcc/../.././gcc/gengtype.c:960: undefined reference to `lexer_line'
... undefined reference to `yylex'
... undefined reference to `yybegin'
... undefined reference to `yyend'
Run Code Online (Sandbox Code Playgroud)
我已经安装了Flex和Bison,甚至尝试了几种具有相同结果的Bison变体.有谁知道这可能意味着什么?
有没有一种简单的方法将Bison/Flex/Yacc集成到XCode中?
我想编写自己的语言进行解析,它与我的ObjC对象进行交互.
但这些工具只会将STDIN作为输入,而只会生成C代码而不是ObjC.它们基本上只对命令行工具有用,否则每次重新生成解析器代码时都需要大量的痛苦来覆盖输出.
我正在尝试在我的macbook上安装Thrift.否则我收到一个错误:
configure:error:必须在系统上安装Bison 2.5或更高版本!
所以试图在我的操作系统上安装Bison,但我没有在互联网上找到教程.有谁能告诉我如何在我的系统上安装Bison?
亲切的问候