好吧,在我寻找编写编译器的必要内容的过程中,我遇到了一些障碍.似乎我发现的每一项技术或工具都在某些地方存在一些反对意见.
我现在使用Bison和Flex,但我觉得这种方法已经过时了.这是真的?这是一种良好的向前兼容的方式来继续编写完整的编程语言吗?
在不同概念和工具的海洋中(ANTLR,LL(k),GLR,LALR,LLVM,Flex,Bison)编写编译器的当前趋势和最佳实践是什么?龙书是否已过时?
我正在使用bison&flex(通过cygwin下载)和vc ++.当我编译程序时,我收到一个错误:
...: fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory
Run Code Online (Sandbox Code Playgroud)
flex生成的文件中的相应代码是:
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
* down here because we want the user's section 1 to have been scanned first.
* The user has a chance to override it with an option.
*/
/* %if-c-only */
#include <unistd.h>
/* %endif */
/* %if-c++-only */
/* %endif */
#endif
Run Code Online (Sandbox Code Playgroud)
如果我在flex文件(.l)中定义YY_NO_UNISTD_H,则此错误将消失,但我还会收到其他几个错误:
...: error C2447: '{' …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用flex和bison来创建一个过滤器,因为我想从复杂的语言中获取某些语法元素.我的计划是使用flex + bison来识别语法,并转出感兴趣的元素的位置.(然后使用脚本根据转储的位置获取文本.)
我发现flex可以支持一个叫做bison-locations的野牛功能,但它是如何工作的.我在flex文档中尝试了这个例子,似乎yylloc不是由flex自动设置的,我总是得到(1,0)-(1,0).可以自动灵活计算每个令牌的位置吗?如果没有,我定义了什么接口函数来实现?有什么例子吗?
有关工具的更好解决方案吗?
最诚挚的问候,凯文
编辑:
现在,yylex的界面转向:
int yylex(YYSTYPE * yylval_param,YYLTYPE * yylloc_param );
Run Code Online (Sandbox Code Playgroud)
bison手册没有说明lexer应如何实现正确设置yylloc_param.对我来说,很难手动跟踪每个令牌的列号.
我试图将一个结构作为与Bison联合的一部分包含在内,但是我在%union中的'struct node args'上得到一个错误:
parser.y:17: error: field ‘args’ has incomplete type
Run Code Online (Sandbox Code Playgroud)
代码:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
Run Code Online (Sandbox Code Playgroud)
谁知道我做错了什么?
如何针对给定语法删除bison的shift-reduce冲突?
selection-stmt -> if ( expression ) statement |
if ( expression ) statement else statement
Run Code Online (Sandbox Code Playgroud)
提供修改后的语法的解决方案将受到高度赞赏.
yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果你不使用yylval,那么你不需要使用union?
使用lex/yacc编写C++编译器需要多长时间?
我在哪里可以开始使用它?
我希望我的语言有两个功能,使Python这种格式很好的语言:
任何人都可以给我一个关于如何用flex/bison类似工具实现的详细提示吗?这种块特征迫使用户编写可读代码.
我正在将构建系统从configure/make转换为cmake系统
该系统有一些自动生成的文件,来自bison/flex.原始的makefile命令是:
bison --defines=tokens.h --output=parser.cpp parser.y
flex --outfile=scanner.cpp scanner.l
Run Code Online (Sandbox Code Playgroud)
我遇到了这个古老的链接,似乎解释了如何做到这一点,但是当我使用以下自定义命令运行cmake时,似乎没有任何事情发生(没有错误消息,没有文件生成)
FIND_PACKAGE(BISON REQUIRED)
IF(BISON_FOUND)
ADD_CUSTOM_COMMAND(
SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y
COMMAND ${BISON_EXECUTABLE}
ARGS --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h
-o ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y
COMMENT "Generating parser.cpp"
OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
)
ENDIF(BISON_FOUND)
FIND_PACKAGE(FLEX REQUIRED)
IF(FLEX_FOUND)
ADD_CUSTOM_COMMAND(
SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l
COMMAND ${FLEX_EXECUTABLE}
ARGS -o${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l
COMMENT "Generating scanner.cpp"
OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp
)
ENDIF(FLEX_FOUND)
Run Code Online (Sandbox Code Playgroud)
我是cmake的新手,所以这对我来说有点混乱.有没有人知道什么是有效的custom_command?
bison ×10
flex-lexer ×6
yacc ×3
c ×2
c++ ×2
parsing ×2
cmake ×1
cygwin ×1
indentation ×1
lemon ×1
makefile ×1
resources ×1
visual-c++ ×1