标签: bison

编写编译器......什么是对的,什么是错的?

好吧,在我寻找编写编译器的必要内容的过程中,我遇到了一些障碍.似乎我发现的每一项技术或工具都在某些地方存在一些反对意见.

我现在使用Bison和Flex,但我觉得这种方法已经过时了.这是真的?这是一种良好的向前兼容的方式来继续编写完整的编程语言吗?

在不同概念和工具的海洋中(ANTLR,LL(k),GLR,LALR,LLVM,Flex,Bison)编写编译器的当前趋势和最佳实践是什么?龙书是否已过时?

compiler-construction resources bison flex-lexer

24
推荐指数
4
解决办法
2226
查看次数

unistd.h在vc ++下编译bison&flex程序时的相关难度

我正在使用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)

cygwin bison visual-c++ flex-lexer

24
推荐指数
4
解决办法
3万
查看次数

flex如何准确支持野牛位置?

我正在尝试使用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 flex-lexer

20
推荐指数
6
解决办法
2万
查看次数

在Bison/Yacc的%union def中包含struct

我试图将一个结构作为与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)

谁知道我做错了什么?

c yacc bison

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

柠檬的力量与否?

对于语法分析器,我曾经与Bison "玩",它有其优点/缺点.

上周,我在SqLite网站上注意到该引擎已经完成了另一个语法分析器: Lemon

阅读精简文档后听起来很棒.
你有关于这个解析器的一些反馈吗?

无法真正看到谷歌和维基百科上的相关信息(只是一些例子,相同的教程)它似乎不太受欢迎.(Stack Overflow中没有标签[编辑:现在有:P])

c parsing bison parser-generator lemon

18
推荐指数
2
解决办法
3177
查看次数

改变语法以消除移位减少if-then-else中的冲突

如何针对给定语法删除bison的shift-reduce冲突?

 selection-stmt -> if ( expression ) statement |
                      if ( expression ) statement else statement
Run Code Online (Sandbox Code Playgroud)

提供修改后的语法的解决方案将受到高度赞赏.

bison shift-reduce-conflict

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

yylval和union

yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果你不使用yylval,那么你不需要使用union?

parsing yacc bison lexical-analysis

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

使用flex/yacc编写C++编译器需要多长时间?

使用lex/yacc编写C++编译器需要多长时间?

我在哪里可以开始使用它?

c++ compiler-construction yacc bison flex-lexer

17
推荐指数
4
解决办法
5016
查看次数

如何使用flex/bison进行类似python的缩进

我希望我的语言有两个功能,使Python这种格式很好的语言:

  • 每行一个声明
  • 块以另一个缩进级别开始,一直持续到结束

任何人都可以给我一个关于如何用flex/bison类似工具实现的详细提示吗?这种块特征迫使用户编写可读代码.

indentation bison flex-lexer

17
推荐指数
3
解决办法
5096
查看次数

CMake和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?

c++ makefile cmake bison flex-lexer

16
推荐指数
2
解决办法
1万
查看次数