标签: bison

如何使用Flex实现双程扫描仪?

作为宠物项目,我想尝试实现我自己设计的基本语言,可以用作网络脚本语言.将C++程序作为Apache CGI运行是微不足道的,因此真正的工作在于如何解析包含非代码(HTML/CSS标记)和服务器端代码的输入文件.

在我的本科编译课程中,我们使用FlexBison为简单语言生成扫描程序和解析器.我们得到了一份语法副本,并编写了一个解析器,将简单语言翻译成虚拟机的简单程序集.flex扫描器将输入标记化,并将标记传递给Bison解析器.

我和我想做的事情之间的区别在于,像PHP一样,这种语言可以有纯HTML标记,脚本语言散布如下:

<p>Hello,
<? echo "World ?>
</p>
Run Code Online (Sandbox Code Playgroud)

假设解析输入文件效率如下,我是不正确的:

  1. 扫描输入,直到找到脚本开始标记('
  2. 第二个扫描程序标记输入文件的服务器端脚本部分(来自打开标记:'')并将标记传递给解析器,解析器无需知道文件中的标记.
  3. 控制返回到第一个继续此常规模式的扫描仪.

基本上,第一个扫描程序仅区分Markup(直接返回到未修改的浏览器)和代码,后者传递给第二个扫描程序,后者又将代码标记化并将标记传递给解析器.

如果这不是一个可靠的设计模式,PHP等语言如何有效地处理扫描输入和解析代码?

parsing bison lexical-analysis flex-lexer

7
推荐指数
1
解决办法
1708
查看次数

Lexer /解析器工具

对于C或C++,哪种词法分析器/解析器生成器是最好的(最容易使用,最快)?我现在正在使用flex和bison,但是bison只处理LALR(1)语法.我解析语言并不真的需要无限的前瞻,但无限的先行将使解析了很多更加容易.我应该试试Antlr吗?可可/ R?Elkhound?别的什么?

parsing antlr bison lexer flex-lexer

7
推荐指数
1
解决办法
8704
查看次数

Flex和Bison的Emacs模式,或删除这些模式的自动缩进?

Emacs在Flex和Bison中对自动缩进的处理很差.事实上,它似乎不支持flex模式.那么,emacs用户如何应对这些?我喜欢VIm,但我不想切换,因为我在Emacs中更快更舒服.

几个月前,我为Bison设立了第三方elisp模块,但当它的缩进破坏时,它永远不会被修复.简而言之,这是一个糟糕的黑客.

或者有没有办法可以关闭.l和.y文件的自动缩进(所以按下会做一个缩进)?我如何仅为emacs更改此elisp设置?

一个简洁的elisp指南也非常有用.如果我有正确的文档,我不介意花几天时间编写自己的flex和bison模式.

emacs elisp indentation bison flex-lexer

7
推荐指数
1
解决办法
2690
查看次数

在野牛推进纯粹的解析器堆处理

有没有办法为堆管理指定我自己的allocator/deallocator函数而不是malloc()/ free()用于bison中的纯推送解析器?

c language-design bison parser-generator

7
推荐指数
1
解决办法
520
查看次数

如何设置flex/bison规则来解析逗号分隔的参数列表

我希望能够使用flex/bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的带括号的)列表.

一些例如可解析的列表:

  • 1
  • 1,2
  • (1,2)
  • (3)
  • 3,4,5
  • (3,4,5,6-)

等等

我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(在提供有效列表时我得到语法错误).关于我如何设置它的任何建议?

cList :   ELEMENT
           {
              ...
           }
        | cList COMMA ELEMENT
           {
              ...
           }
        ;

topLevelList :  LPAREN cList RPAREN
                 {
                     ...                 
                 }
              | cList
                 {
                     ...
                 }
          ;
Run Code Online (Sandbox Code Playgroud)

parsing yacc lex bison flex-lexer

7
推荐指数
1
解决办法
5340
查看次数

野牛java的例子

有没有人知道是否有一些教程和/或网上使用GNU Bison和Java的例子.我在网上搜索过.但我没有找到任何东西.我试图实现一个例子,但我无法编译它(因为我也需要一个词法分析器).这是我的例子:

%{
  static void main(String[] args) {
    yyparse();
  }
%}

%union {
  int     number;
  char    operator;
}

%language "Java"

%token<number>   NUMBER 
%token<operator> OPERATOR  

%type <number> exp

%left OPERATOR
%%

input
    : /* Empty string */
    | exp { System.out.print("Result >> " + $1); }
    ;

exp
    : NUMBER
    | exp OPERATOR exp { 
        switch($2) {
            case '+': $$ = $1 + $3; break;
            case '-': $$ = $1 - $3; break;
            case '*': $$ = $1 * $3; break; …
Run Code Online (Sandbox Code Playgroud)

java grammar yacc bison parser-generator

7
推荐指数
1
解决办法
7389
查看次数

Flex ++ Bisonc ++解析器

我正在尝试使用flexbison在我的项目中为文件结构生成解析器代码.主要编程语言是C++,项目主要是并行运行的OO设计.

我听说flex并且bison生成的解析器是C代码,它们不是重新检测的.谷歌搜索,我发现flex++bisonc++.不幸的是,没有简单的入门教程.大多数例子都是基于bison/flex.有些人以某种方式将bison/flex解析器集成到他们的C++代码中.他们应该"狡猾"......

文档,flex++bisonc++没有帮助我和.教程和示例,它们都从stdin获取输入并在stdout上打印一些消息.

我在解析器中需要这些功能:

  1. 解析器应该是一个C++类,以正常方式定义(头文件和cpp文件)
  2. 解析器从任一个接收数据std::stringstd::stringstream或空终止char*.

我感到很困惑.我应该使用flex++/bisonc++flex/bison?如何做到这一点,满足上述条件?

c++ parsing bison flex-lexer

7
推荐指数
1
解决办法
6307
查看次数

我该如何处理Flex词法分析器中的词法错误?

我目前正在尝试使用Flex + Bison编写一个小编译器,但我在错误处理方面有点迷失,特别是如何使所有东西都融合在一起.为了激发讨论,请考虑我用于字符串文字的以下词法分析器片段:

["]          { BEGIN(STRING_LITERAL); init_string_buffer(); }
<STRING_LITERAL>{
    \\\\    { add_char_to_buffer('\\'); }
    \\\"    { add_char_to_buffer('\"'); }
    \\.     { /*Invalid escape. How do I treat this error?*/ }
    ["]     { BEGIN(INITIAL); yylval = get_string_buffer(); return TK_STRING; }
}
Run Code Online (Sandbox Code Playgroud)

如何处理无效转义的情况?现在我只是打印一条错误消息并打电话exit但我更愿意继续前进并在可能的情况下检测每个文件多个错误.

我的问题:

  • 我用什么功能打印出错误信息?以后野牛预计会出现同样的错误吗?如果我有词法分析器和解析器的单独文件,我在哪里放置yyerror的定义?
  • 我应该从我的行动中返回什么令牌代码?0为"文件结束"?一些特殊的TK_INVALID_STRING令牌?
  • 如何确保解析器可以在词法错误(无效的文字,流浪标点字符等)后继续解析?

yacc lex bison lexer flex-lexer

7
推荐指数
1
解决办法
7243
查看次数

野牛的优先权是没用的?它不起作用

我已宣布这样的优先顺序bison:

    %left '+' '-'
    %left '*' '/'
Run Code Online (Sandbox Code Playgroud)

算术的递归规则:

exp:       exp binary_op exp { .. }
           | literal_exp     { .. }
           | ID              { .. }

binary_op: '+'               { .. }
           | '-'             { .. }
           | '*'             { .. }
           | '/'             { .. }
Run Code Online (Sandbox Code Playgroud)

我有一个算术表达式: 10 * 3 + 5

我的程序计算总和,它是80!我仍然不知道为什么优先权不起作用.

c bison operator-precedence

7
推荐指数
1
解决办法
298
查看次数

如何在flex和bison中使用C++?

我有一个学校项目,我们需要使用flex和bison.我想使用C++,这样我就可以访问我编写的STL和我自己的类.我们获得了以下Makefile:

CC = gcc 
CFLAGS = -g 

OBJs = parse.tab.o symtab.o attr.o lex.yy.o 

default: parser

parser: ${OBJs}
    ${CC} ${CFLAGS} ${OBJs} -o parser -lfl

lex.yy.c: scan.l parse.tab.h attr.h
    flex -i scan.l

parse.tab.c: parse.y attr.h symtab.h
    bison -dv parse.y

parse.tab.h: parse.tab.c

clean:
    rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output

depend:
    makedepend -I. *.c
Run Code Online (Sandbox Code Playgroud)

scan.l和parse.y有一些初始的flex/bison东西来生成扫描器和解析器.我需要将自己的东西添加到这些文件中.symtab.{h,c}应该是符号表的实现.attr.{h,c}用于某些属性魔法.我想制作symtab.ca .cc文件,以便我可以使用STL.我还有其他原因想要使用C++.

我尝试使用parse.ypp文件,以便生成.cpp文件.但问题是我没有得到正确的.h文件.我将Makefile更改为如下所示:

CC = g++          # Change gcc to g++
CFLAGS = -g 

OBJs = lex.yy.o parse.tab.o symtab.o attr.o

default: lex.yy.c parser    # added lex.yy.c so I could …
Run Code Online (Sandbox Code Playgroud)

c c++ bison flex-lexer

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