Tag: bison

来自词法分析器和语法的简单计算器的意外行为

我开始了整个Flex和Bison的世界。 所以我按照教程为flex编写了这个l文件: %{ #include #include void yyerror(char *); #include “y.tab.h” %} %% /******************** RULES ********************/ /* One letter variables */ [az] { yylval = *yytext – ‘a’; // This is to return a number between 0 and 26 representting the letter variable. printf(“VAR: %s\n”,yytext); return VARIABLE; } /* Integer constants */ [0-9]+ { yylval = […]

循环依赖解析与野牛生成的文件

我在野牛的yacc文件中有这个代码块。 这是Flex&Bison书的flex / bison代码中的代码。 yacc代码可以从https://github.com/GrooveStomp/Flex-Bison/blob/master/samples/purecalc.y下载 %{ # include “purecalc.lex.h” # include “purecalc.h” #define YYLEX_PARAM pp->scaninfo %} 问题是我有一个编译错误( 循环依赖解析与bison生成的文件 ); 它们是循环相关的,因为purecalc.lex.h依赖于purecalc.h文件中的pcdata,而purecalc.h依赖于purecalc.lex.h中的yyscan_t。 yyscan_t在purecalc.lex.h中是defiend: typedef void* yyscan_t; pcdata定义如下: /* per-parse data */ struct pcdata { yyscan_t scaninfo; /* scanner context */ struct symbol *symtab; /* symbols for this parse */ struct ast *ast; /* an AST for */ […]

Flex和Bison:使用特定关键字开始一个句子

我正在使用Flex和Bison开发一个程序。 我的任务可以仅使用Flex(使用开始条件等)完成,但我已经明白使用Bison可能会让我的生活更轻松。 我的任务是设计一个识别编程语言声明部分的程序。 通过下面的代码可以理解它的语法和逻辑。 我的问题是,我希望我的程序能够将代码的每个部分识别为可接受的声明部分,该部分仅以 “ var ”关键字开头! 到现在为止,我还没有成功。 我怎么能成功呢? 我在我的.l(flex)和.y(野牛)文件下面。 exercise4.l %{ #include %} %% [ \t\n]+ { /* Ignore all whitespaces */ } “;” { /* Ignore all semicolons */ } “:” { /* Ignore all colons */ } var { printf(“A keyword: %s\n”,yytext); return VAR; } real { printf(“A variable type: %s\n”,yytext); […]

在北美野牛解析一个while循环

在Bison中实现简单while循环的最佳方法是什么? 如果它有所作为,我使用C,但我也可以使用C ++。

用C模拟野牛的布尔

我正在尝试使用C和Bison制作逻辑计算器,但我遇到了麻烦,因为C没有布尔类型。 这是我的Flex规则的一部分: “TRUE” | “T” | “t” {yylval = 1; return TRUE; } “FALSE” | “F” | “f” {yylval = 0; return TRUE; } 这是我的Bison规则的一部分: line: EOL | exp EOL {printf(“%d %d %d \n”), $1, $2,$$;} ; exp: TRUE | FALSE ; 这是我在计算器中输入T后跟EOL(行尾)时的输出: 10 12 1 10是asline为换行符,12为ascii用于回车,1为Ascii用于启动我有相同的输出为F. 如果我输入一个T,如果我输入F,那么1是1美元,1美元是1美元?

Flex具有启动条件可重入

我正在尝试制作一个依赖于启动条件的可重入扫描器。 我正在跟随类似这个家伙的问题: 用Flex编写重入词法分析器 正如一张海报所提到的,如果您明确创建yyscan_t并将其作为额外参数传递,则扫描程序将起作用。 但是,当使用BEGIN 等操作启动条件时,我仍然会收到yyg undeclared错误消息。 这是一个错误吗? 我应该明确使用yy_push_state和yy_pop_state状态函数吗?

从stdin到文件的Flex / Bison EOF传播

我有一个扫描仪,解析器和一个main,我通过它创建一个可执行文件 bison -d parser.y; flex scanner.l; gcc main.c parer.tab.c lex.yy.c 当我运行./a.out它会按照我想要的方式执行操作:如果Ctrl+D则会检测到EOF ,并且main可以相应地执行操作。 这意味着:如果yyin是stdin那么点击Return结束该行的解析,主循环等待下一个输入行。 按Ctrl+D结束主循环中的break解析输入并退出。 如果输入来自一个文件,e,g, testFile该文件可以包含1个要解析的表达式,直到EOF。 在文件场景中,新行应该像空格和制表符一样被吃掉。 当输入来自stdin时,所有这些应该像解释器一样,当输入来自文件时,它应该像脚本评估器一样。 这种测试文件的示例内容是: test\n 。 这里未检测到EOF。 我很难理解为什么会这样。 换句话说,我想在这里扩展问题,以便另外使用输入文件 parser.y: %{ #include #include #include /* stuff from flex that bison needs to know about: */ int yylex(); int yyparse(); FILE *yyin; static int parseValue; void yyerror(const char *s); %} %token […]

如何从lex / yacc生成不同的yyparse函数以在同一程序中使用?

我想从lex / yacc生成两个单独的解析函数。 通常yacc会为你提供一个函数yyparse(),当你需要进行一些解析时,你可以调用它,但是我需要有几个不同的yyparses,每个yypars都与不同的词法分析器和语法相关联。 手册页似乎建议使用-p(前缀)标志,但这对我不起作用。 我从gcc那里得到错误,表明yylval没有被正确地重新标记(即它声称没有定义几个不同的令牌)。 有谁知道生成这些单独函数的一般rpocedure? 谢谢

野牛与yyerror的冲突类型

我正在尝试从flex和bison制作计算器,但我在编译期间发现了一个错误。 这是错误: C:\GnuWin32\src>gcc lex.yy.c y.tab.c -o tugas tugas.y:51: error: conflicting types for ‘yyerror’ y.tab.c:1433: error: previous implicit declaration of ‘yyerror’ was here 这是我的.l代码: %{ #include #include “y.tab.h” YYSTYPE yylval; %} plus [+] semi [;] minus [-] var [az] digit [0-1]+ equal [:=] %% {var} {yylval = *yytext – ‘a’; return VAR;} {digit} {yylval = atoi(yytext); […]

具有转义字符的Flex / Lex编码字符串

我将在某些背景下提到这个问题: flex / lex中字符串文字的正则表达式 我遇到的问题是在我的词法分析器中使用转义字符处理输入,我认为这可能与字符串的编码有关,但我不确定。 这是我在lexer中处理字符串文字的方式: \”(\\.|[^\\”])*\” { char* text1 = strndup(yytext + 1, strlen(yytext) – 2); char* text2 = “text\n”; printf(“value = \n”, text1, text1); printf(“value = \n”, text2, text2); } 这输出如下: value = value = 它似乎将换行符分别视为反斜杠后跟n。 这里发生了什么,如何处理文本与C输入相同?