Bison非终结词在语法上是无用的

当我使用bison test.y编译下面的语法时,它警告非终结符“header\u stms”和“forward”是无用的。为什么?它们在“程序”规则中使用。非终结符“stm”不会报告为无用 %% program: /* empty */ | stm | header_stms ; header_stms: header_stms forward ; /* forward proc declaration */ forward: "forward" TK_I

Bison错误:m4子进程失败

我正在尝试分析语法,但出现以下错误: bison -t -vd brest.y brest.y: warning: 52 shift/reduce conflicts [-Wconflicts-sr] brest.y: warning: 76 reduce/reduce conflicts [-Wconflicts-rr] brest.y:167.105-121: warning: rule useless in parser due to conflicts [- Wother]

带flex和bison的计算器

我正在用flex和bison做一个简单的计算器,当我编译它时,它告诉我“$1的…没有声明的类型” 我必须打印表达式的类型及其结果。 表达式的类型可以是浮点、整数或字符串。 这是我的野牛代码: %{ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <symtab.h> extern int

Bison 如何防止Flex丢弃输入字符?

我试图在Flex lexer中读取已知数量的字符(在运行时)。我知道它以CRLF开头,所以我匹配它,然后使用yyinput读取文字长度字符 <EXPECT_LITERAL>"\r\n" { for(int i=0;i<literal_length;i++){ int c= yyinput(yyg); if(c == EOF) break; } *yylval = val_new_s(yytext); re

Bison 在YACC错误消息中打印多字符标记

例如,如果Yacc检测到语法错误并定义了详细错误,则会打印错误消息 unexpected '[', expecting BECOMES 有没有办法用错误消息中的实际字符串(例如,:=)替换多字符令牌(例如,变为)的令牌名称?我询问的原因是,变成代表:=对解析器的用户来说可能并不明显,您可以通过在%token定义中的令牌名称后加引号来定义一个人类可读的令牌名称版本: %token BECOMES "':='" 这会将错误消息更改为: unexpected '[', expe

Bison 警告野牛汇编

我正在使用flex/bison开发编译器。 我的生成输出中有此警告 警告:在默认操作中键入clash('s') 有什么帮助吗?它似乎与源代码中的%token和%type声明有关。 如果没有源代码行以及相关的标记和类型声明,就很难为您提供帮助 如果指定val类型的expr并定义tptr类型的ID标记 %{ #include "parser.h" %} %type <val> expr %token <tptr> ID 请注意,在本例中,我当前使用的野牛级别打印的消息略有不

Bison如何在不移位的情况下描述语法中的可选语法以减少冲突?

我有一个用语法描述的文件。它有一个部分可以由一种或两种内容组成,并且可以按任意顺序排列: ... type_a_thing type_b_thing type_b_thing type_a_thing .... 或者只是 ... type_a_thing ... 或 或任何组合,在任何数量的事件中。类型a和类型b都有一个定义良好的结构。我已经设法描述了这一点,以便解析器能够工作,但我仍然得到了shift/reduce错误。 我在这里上传了一个简单的例子: 这是解决这个问题的正确方法吗?我做

Bison 删除移位/减少与点表达式和数组的冲突

对不起,我是野牛队的新手。我不明白这个问题以及如何解决它。如果您能“教我如何钓鱼”,同时指出问题和解决方案,我将不胜感激: %left '.' '+' %right '(' '[' %% OptionalExpressions : { $$ = nullptr; } | Expressions ; Expressions : Expression | Expressions ',' Expression ; Expression : Expression '+

如何让Flex扫描仪返回Bison';什么是错误标记?

Bison使用一个特殊的错误标记(称为“error”),可以在Bison解析器中使用它来从错误中恢复。有没有办法从Flex生成的扫描仪返回此特定令牌?此“错误”令牌实际上不是令牌。它仅用于错误处理 在上,您可以阅读:令牌名称错误是为错误处理保留的,不应简单地使用 在我自己的解析器中,我使用如下错误标记(用于解析类似C的宏语言: StatementList : | StatementList Statement ';' | erro

Bison yyparse参数列表:%parse参数是否可移植?

我目前正在与yacc&lex打交道。不过,这一部分大部分已经完成 我想让yyparse函数接收一个参数 我在bison文档中找到了这个 这几乎解决了我的问题,但我想知道你们是否使用过 %parse-param {int *nastiness} 在Linux之外,我的意思是,你知道%parse param是否是可移植的吗?它是否包含在yacc标准中?%parse param不在,并且它不会与所有的yacc实现一起工作。另一方面,没有任何东西将bison链接到Linux,而且bison本身是非常

Bison Flex将在特定规则中永久备份

我的解析器是针对汇编程序的,这里是和文件以防万一 在本例中,所有操作都像一个符咒: nop nop nop 这里是调试输出 --accepting rule at line 154 ("nop") --accepting rule at line 248 (" ") --accepting rule at line 154 ("nop") --accepting rule at line 248 (" ") --accepting rule at line 154 ("nop") --acce

Bison 野牛%联合使用

因此,我在.y语法中设置了一个AST,下面是如何使用它的示例片段: typedef struct node { struct node *left; struct node *right; char *token; } node; ... exp : term {$$ = $1;} | exp PLUS term {$$ = mknode($1, $3, "+");} | exp MINUS term {

flex和bison彼此需要什么?

当flex和bison一起使用时 为什么flex文件需要包含bison创建的C头文件 编译需要bison和flex创建的C源文件。bison和flex创建的C源文件相互需要什么 bison生成的报头中最重要的是enum值,用于标识令牌类型,这些令牌类型是通过词法操作返回给解析器的值 标头还声明了YYSTYPE语义类型,以及具有该类型的变量yylval,用于将每个标记的语义值传递给解析器。至少,对于具有语义值的标记。类似地,如果解析器使用位置信息,则标头定义YYLTYPE位置类型以及该类型的变量y

Bison 野牛:float=int/int

我正在学习Bison/Flex,我不明白如何将$$类型强制为.y文件中的float。 scanner.l文件 parser.y文件 在expr规则中,printf输出是正确的。例如,如果输入为7/3,则打印输出为2.333。但在程序规则中,printf输出是2.000000。expr规则中的$$或程序规则中的$1似乎是int类型。正当为什么?因为int是所有语义值的默认类型,除非您指定其他类型。有关详细信息,请参阅 如该链接所示,它可以简单地添加 %define api.value.type {

Bison Yacc的某些版本是否使用'=';在规则和行动之间?

我正在编译一个非常旧的程序(大约2000年的wu ftpd 2.6.1),它在以下代码上失败: cmd_list: /* empty */ | cmd_list cmd = { fromname = (char *) NULL; restart_point = 0; } | cmd_list rcmd ; Bison说问题出在出乎意料的“=”上,这是有道理的,因为我见过的所有其他Yacc程序(当然不是很多)都没有使

Bison 野牛与图案匹配的顺序是什么? 描述

我想用bison实现json文件的语法检测器 我曾经 识别语法错误,如[“额外逗号”,],但失败。但是对象的类似模式也适用。我认为这可能与图案顺序有关 然而,当我使用 Values: Value | Value COMMA Values | Value COMMA error { puts("extra comma, recovered"); } 它成功了。我想知道为什么 Value COMMA error { puts(&qu

Bison 野牛计算器问题

bison何时执行stmt非终端。当它看到哪个字符时?假设这些都是bison输入的规则,非终端符号stmt在达到EOF时立即“执行”(即:不再输入,最后一个expr已减少) 但是,你的语法有冲突。我不明白这个问题。stmp是什么?哎呀,这是个打字错误。现在我修好了 stmt : expr {printf("%d\n",$1);} ; expr : expr '+' expr {$$ = $1 + $3;} | expr '-' expr {$$ = $1 - $

如何编写flex和bison文件来解析这种语言?

让我们定义一种语言: VAR := [0-9A-Za-z_]+ Exp := VAR | VAR,'=',VAR | '(', Exp, ')' | Exp, '&', Exp | Exp ,'|', Exp 例如:“(a=b)和(c|(d=e))是合法的 我已经阅读了YASS&Lex手册,但我完全搞不懂,我只想要能够解析这种语言的编译器 你能告诉我如何为这种语言编写flex&bison配置文件吗 到目前为止,我已经做到了: 文件a.l: %

Bison if-elsif-else语句解析

我一直在使用lex和yacc为命令式语言编写编译器,今天我完成了语法,我在网上看到,每种语法都会有一些移位/减少冲突,特别是如果它有if/else语句,这通常被称为悬挂if-else,我的确有if/elsif/else语句,但编译时不会引发任何冲突,问题是 这是否意味着该语法有缺陷,只是因为它没有引发任何移位/减少冲突?我在这方面没有太多经验,但我找不到任何问题 如果需要更多信息,此语法中if/elsif/else语句的结果如下: statement -> ... -----------

bison和flex分割错误

我试着用奥雷利的书来学习莱克斯和亚克。我试着按照书中的例子,但它给出了分段错误 %{ /** * A lexer for the basic grammar to use for recognizing English sentences. */ #include <stdio.h> extern FILE *yyin; %} %token NOUN PRONOUN VERB ADVERB ADJECTIVE PREPOSITION CONJUNCTION %

Bison 根据上下文无关语法查找歧义语句

我有一个家庭作业,根据定义语句的语法,我应该检测语句中的歧义 例如: Grammar: S -> S + S | S * S | id Statement: id * id + id 上面的语句不明确,因为可能有两个解析树 到目前为止,我有以下模糊之处: 1) Operator precedence (example above) 2) If-else dangling case 3) Infinite loop (example above is left recursive) 4)

bison中的相互递归

我正在尝试使用flex/bison为类似verilog的语言(或者更具体地说是带有一些额外构造的verilog,用于生成verilog代码)创建一个解析器,但我很难弄清楚如何构造bison规则来处理该语言中可用的一般类型的构造 该构造的一般示例如下: ( output wire up_o, input wire [4:0] up_i, /////////////////////////////////////////////////////////// // A com

Bison 带有野牛和flex源的自动工具

我有一个C项目,其中包括一个flex和一个bison源文件;flex文件#包括bison生成的tab.h文件 因此,我在configure.AC文件中添加了AC_PROG_LEX和AC_PROG_YACC。但在我运行autotools并尝试创建项目之后,flex生成的.c文件将在bison运行以生成flex.c文件包含的tab.h文件之前进行编译。因此,编译失败 我是一个非常熟悉autotools(和stackoverflow!)的新手——我需要让autotools意识到flex.o对bison

Bison伪变量返回错误的值

我对野牛有奇怪的问题。我是begginer,如果我错了,请纠正我,但是$1、$2……等等应该返回第一个、第二个等等的终端/非终端的值,是吗 command: IDENT{printf("%s",$1);} SET{printf("%s",$1);} expression{printf("%s",$1);} ENDCMD 我在做编译器,因为从上面的例子中,我得到了类似“a:=1”(其中ident是“a”,set是“:=”,num是“1”)“a”在第一次调用中,a:=”在第二次调用中,a:=1在第

使用Bison的后缀计算器

嗨,我一直在尝试创建一个简单的后缀计算器 以下是片段: %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ %% /* Grammar rules and actions follow. */ input: /

Bison 野牛的移位/减少误差

yacc的语法如下所示: 18. Stmt_list : Stmt | Stmt_list ';' Stmt; 19. Stmt : Variable assignop Expression; 20. Variable : id | id'['Expression']'; 21. Expression : Simple_expression | Simple_expression relop Simple_expression; 22. Simple_expression : Term | Si

Bison 我收到这个消息';规则在语法上毫无用处';

我是野牛队的新手。我写了一些规则,但我得到了很多“语法上无用的规则” 我认为“expr”导致了这个问题。请帮帮我 File : | class {printf("accepted");} ; class : CLASS IDENT '{' function '}' | CLASS IDENT '{' global '}' ; global : data_type IDENT ; function : |data_type IDENT'('Params')' '{'statement'

Bison Flex编译器错误:请求非结构或联合中的成员

我想一起使用Flex和Bison。我在bison定义文件中声明了一个union,我将在lexer中使用它。Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包括了这个.tab.h文件,但是lexer操作: yylval.stringptr = yytext; 导致编译器错误: 以下是.tab.h文件的一个片段: 为什么yylval不被认为是一个结构或联盟?我应该如何纠正这个问题? PS:我使用--bison bridge调用了Flex,如果您使用--

Bison 如何将flex缓冲区重定向到我的缓冲区

经过几天的努力,我仍然无法找到如何声明缓冲区。 将flex缓冲区重定向到我的缓冲区的正确方法是什么? 我想做的步骤是: 1-无条件,不返回原始缓冲区,只需通过调用函数从图形前端永久重定向缓冲区。 2-将文本从图形前端复制到我的缓冲区(或者更好地将fely缓冲区直接复制到前端缓冲区) 3-呼叫yyparse 4-重复步骤2和3 也许声明这样一个简单的公共函数就足够了: void setmybuffer(char *ptr) { yy_scan_string (char *ptr); .... /

Bison Yacc错误:‘;yylval’;未声明(首次在此函数中使用)

我正在尝试使用lex/yacc程序解析以下配置文件 下面给出了我的配置文件 [ main ] e_type=0x1B 下面给出了我的lex文件(test.l) 我得到以下错误 yacc: e - line 67 of "test.y", $1 (NUMBER) is untyped test.l: In function ‘yylex’: test.l:44:5: error: ‘yylval’ undeclared (first use in this function) yylv

Bison 使用多个输出文件的lex/yacc程序

我正在使用lex和yacc,我需要创建两个输出文件。我需要做什么(如果有任何函数可以生成多个文件),以及如何命名每个文件 使用lex和yacc,我需要测试一个包含css的html文件,并从中生成两个文件,一个包含html,另一个包含css。基本上把css和html分开,放在不同的文件中 如果有人能提供一个如何生成两个输出文件的简单示例。您的问题有点宽泛,但正如收到的评论所表明的,也有点模棱两可。不过,我想我理解你的要求。首先,我将解决这个模棱两可的问题,然后开始解释如何实现你想要的 你似乎忽略了

Bison语法移位/减少冲突处理阶乘和其他一元运算符

当我读一本关于bison的书时,我正在和它闲逛,我正在做一个简单的中缀计算器,在这里我使用语法来指定优先级,而不是使用%left/%right和这些声明的顺序 我见过的大多数野牛计算器都将阶乘作为函数而不是运算符,所以这些例子并没有什么帮助 目前我有: 15 calclist: 16 | calclist expr EOL { printf(" = %d\n", $2); } 17 | calclist EOL { /* nada */ } 18 ; 19 expr: 2

Bison 野牛3.2汇编问题

编译bison 3.2时出现以下错误 ar: two different operation options specified 你知道吗? 我正在使用gcc 6.3.0构建Bison。得到了答案,我们需要应用以下补丁 我们需要查看错误前的行,以找出您收到该消息的原因。

Bison 分析文件时出现错误

我正在使用Bison和flex创建我的C编译器的语法。 在运行bisonflex和Gcc之后。一切都很好。 当运行解析器时。第一行输入正确工作;但在输入的第二行中,它抛出以下bison yyerrorerror消息: 分析错误,应为“$” 我没有带美元符号的代币 为了简单起见,我选择不显示y代码;但如果你需要看,我可以编辑。我只想知道这个错误消息的原因 编辑:添加野牛代码 %{ #include <string.h> #include <stdio.h> #includ

Bison 《野牛语法》中的悬空语

下面的语法遇到了悬而未决的else问题,尽管我在阅读后试图解决它,但我想知道你是否能发现我做错了什么 %{ %} %token PROGRAM CONST TYPE ARRAY LIST SET OF RECORD VAR FUNCTION PROCEDURE %token INTEGER REAL BOOLEAN CHAR FORWARD LENGTH NEW T_BEGIN END IF THEN ELSE %token WHILE DO CASE OTHERWISE FOR TO DOW

编译Bison/Flex文件时未定义的令牌

我开始使用Bison/YACC和Flex/Lex,但我无法编译最简单的解析器 文件:Ruby.y %{ #include <stdio.h> #include <stdlib.h> %} %start program %token NUMBER %% program : NUMBER; %% main( int argc, char* argv[] ) { yyparse(); } yyerror(char *s){ printf("%s

如何匹配bison语法中的字符串?

如何匹配bison语法中的字符串?比如说,一个像“polySphere”一样代表自身的字符串。我是否必须在.lex文件中创建一个类似POLYSPHERE的令牌,然后在bison中使用它?我不能直接使用字符串吗 谢谢您无法在语法中识别字符串。您将出现如下错误: 不支持多字符文字标记 你应该简单地添加你的lex “polySphere”{return polySphere;}您可以逐个字符识别bison中的字符串,例如: polysphere: 'p' 'o' 'l' 'y' 'S' 'p' 'h'

当使用flex/bison在advanced中已知n时,如何解析由n行组成的数据结构?

flex/bison是否适合解析包含N个顶点的数据结构,这些顶点由表示x、y、z坐标的三个浮点数组成,而N是事先已知的?如果是这样,解析器/词法分析器的设置会是什么样子 需要填充的结构(将创建这些结构的数组) 输入文本 Vertices: n x1 y1 z1 x2 y2 z2 ... xN yN zN 我假设的是真的(flex/bison的新产品可能是错的) 解析器定义中定义的标记 词法分析规则 你没有把你的语法文件;所以,我猜是这样的: %{ int num_vertice

Bison 用于中缀到前缀转换的LEX-YACC解析器

翻译方案: expr -> {print("+")} expr + term | {print("-")} expr - term | term term -> {print("*")} term * factor | {print("/")} term / factor | factor factor -> digit {print(digit)} | (expr) 上述语法将以前缀形式打印表达式。对于这种语法

Bison 根据epsilon规则改变/减少第一状态中的冲突

我已经转移/减少了野牛的冲突 我检查了parser.output文件: State 0 0 $accept: . Prog $end STRUCT shift, and go to state 1 $default reduce using rule 6 (Structs) Prog go to state 2 Structs go to state 3 StructDec go to state 4 我有规则: Prog : Structs F

Bison 野牛,简单的计算器程序

我想做一个简单计算器的解析器,但我无法理解为什么简单输入会出错。 Flex文件如下所示 %{ #include "exp.tab.h" #include <string.h> %} blanks [ \t\n]+ %% {blanks} { /* ignore */ } [0-9]+ {yylval= strtol(yytext, NULL, 10); return(NUMB);} %% 我收到错误消息。为什么会发生这种

I';使用选项%defines";编译bison时出错;语法分析器;

我的Parser.y文件包含以下代码 %defines "Parser.h" 我已经编译了这个文件,我有一个下面的错误 $bison解析器.y Parser.y:27.10-19:语法错误,意外字符串 所以我已经发表了这一行评论 //%defines "Parser.h" 我编译了这个文件,并没有错误,但它并没有生成输出头文件 我改变了编译选项 $bison Parser.y--defines=Parser.h 这是成功的,但我不想使用选项与“野牛”命令 换句话说,我想在bison文件中使用

Bison 如何将语句作为参数携带

我正试着写一种类似Forth的语言。第二个声明工作得很好,但我在使用它时遇到了麻烦。 在“Official”中,第四次调用是原语地址列表,而在我的方法中,第二次调用是一组调用,而不仅仅是地址。e、 g.内存中声明的MYFUNCTION如下所示: MYFUNCTION: call primitive_foo; call primitive_bar; .... call primitive_foobar; return ; 声明如下: stmt: V

Bison:减少冲突

我有一个野牛语法,这是一个适当的子集。 Bison报告有76个轮班/减少冲突。在浏览了各国的产出后,我只发现9个国家是因为我对报告的解释有误 运行一套GTest单元测试,应涵盖所支持的词汇结构,其中4个测试间歇性失败,并出现意外的标记错误(对于每个失败,每次都是相同的意外标记) 我在一个循环中运行了大约8小时的测试,每个测试失败了3次 有没有人能提供一些关于Bison中可能提供的任何选项的建议,以帮助获得更多调试信息来尝试和跟踪这些选项 我启用了跟踪解析,但它们很少失败,因此在输出中查找相关信息

忽略flex和bison中的空白

我正在尝试分析以下行: BEGIN WRAP WIO3 NAME lgCell_prg160_io CONDITION UNI_PLACE_GLOBAL && compBits ENDS WIO3 我用来解析上面几行的语法一直解析到UNI\u PLACE\u GLOBAL,然后给出解析错误 请帮我找出我犯的错误 我认为它不接受空格,所以我如何

使用bison/flex的多类型计算器

我正在尝试使用flex和bison实现一个多类型计算器。 我的问题是如何写出符合我目标的语法 例如:5+3.4,结果应该是一个浮点数。 5+5,一个整数结果。 ... etc这是另一个可能相关的先前答案的可能重复:

Bison yacc中的用户定义运算符优先级

我正在尝试编写一个yacc程序,它从用户那里获取其运算符的优先级,然后使用这些优先级规则来计算中缀表达式 我尝试通过使用%left旁边的字符变量来定义优先级,然后在调用yyparse函数之前将这些字符变量分配给我想要的运算符。比如: %left op1 %left op2 %left op3 %left op4 如果直接给出编译错误和shift/reduce错误警告,则无法工作。我也读过关于%prec的文章,但我认为我不能用它来解决这个问题。简单的方法是让lexer根据优先级返回一个合适的to

可重入Bison解析器。各部分中的代码是全局的吗?

在SO的帮助下,我正在使用Bison编写一个可重入解析器,但实际上还没有彻底测试可重入部分。我刚刚查看了Bison生成的.tab.c文件,惊讶地发现%{}%或各种%code部分中的所有代码都是全局的。我希望它们是yyparse()的本地对象 我假定在解析器中本地使用的任何变量都必须使用%parse param进行传递。 令人惊讶的是,%代码没有引用可重入用法 例如: %{ mystruct *someStruct; }% 因此,yyparse()的多次调用将引用

仅将字符串与Flex/Bison一起使用

我是Flex/Bison的新手。我只想对值使用字符串,这是一个语言转换器。我有这个测试: 例1: 但工作还是如期而至 如果我不使用define YYSTYPE char const*,而是使用%union: %union { char * txt; } %token <txt> NUMBER 并将赋值更改为[0-9]+{yylval.txt=strdupyytext;returnnumber;},它没有警告并且可以工作 我试着在flex文件中定义相同的YYSTYPE并强制执

上一页 1 2  3   4   5   6    7   8   9  ... 下一页 最后一页 共 15 页