当我使用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 -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做一个简单的计算器,当我编译它时,它告诉我“$1的…没有声明的类型”
我必须打印表达式的类型及其结果。
表达式的类型可以是浮点、整数或字符串。
这是我的野牛代码:
%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <symtab.h>
extern int
标签: Bison
flex-lexeryacclex
我试图在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
例如,如果Yacc检测到语法错误并定义了详细错误,则会打印错误消息
unexpected '[', expecting BECOMES
有没有办法用错误消息中的实际字符串(例如,:=)替换多字符令牌(例如,变为)的令牌名称?我询问的原因是,变成代表:=对解析器的用户来说可能并不明显,您可以通过在%token定义中的令牌名称后加引号来定义一个人类可读的令牌名称版本:
%token BECOMES "':='"
这会将错误消息更改为:
unexpected '[', expe
我正在使用flex/bison开发编译器。
我的生成输出中有此警告
警告:在默认操作中键入clash('s')
有什么帮助吗?它似乎与源代码中的%token和%type声明有关。
如果没有源代码行以及相关的标记和类型声明,就很难为您提供帮助
如果指定val类型的expr并定义tptr类型的ID标记
%{
#include "parser.h"
%}
%type <val> expr
%token <tptr> ID
请注意,在本例中,我当前使用的野牛级别打印的消息略有不
标签: Bison
flex-lexershift-reduce-conflictambiguous-grammar
我有一个用语法描述的文件。它有一个部分可以由一种或两种内容组成,并且可以按任意顺序排列:
...
type_a_thing
type_b_thing
type_b_thing
type_a_thing
....
或者只是
...
type_a_thing
...
或
或任何组合,在任何数量的事件中。类型a和类型b都有一个定义良好的结构。我已经设法描述了这一点,以便解析器能够工作,但我仍然得到了shift/reduce错误。
我在这里上传了一个简单的例子:
这是解决这个问题的正确方法吗?我做
对不起,我是野牛队的新手。我不明白这个问题以及如何解决它。如果您能“教我如何钓鱼”,同时指出问题和解决方案,我将不胜感激:
%left '.' '+'
%right '(' '['
%%
OptionalExpressions
: { $$ = nullptr; }
| Expressions
;
Expressions
: Expression
| Expressions ',' Expression
;
Expression
: Expression '+
Bison使用一个特殊的错误标记(称为“error”),可以在Bison解析器中使用它来从错误中恢复。有没有办法从Flex生成的扫描仪返回此特定令牌?此“错误”令牌实际上不是令牌。它仅用于错误处理
在上,您可以阅读:令牌名称错误是为错误处理保留的,不应简单地使用
在我自己的解析器中,我使用如下错误标记(用于解析类似C的宏语言:
StatementList :
| StatementList Statement ';'
| erro
我目前正在与yacc&lex打交道。不过,这一部分大部分已经完成
我想让yyparse函数接收一个参数
我在bison文档中找到了这个
这几乎解决了我的问题,但我想知道你们是否使用过
%parse-param {int *nastiness}
在Linux之外,我的意思是,你知道%parse param是否是可移植的吗?它是否包含在yacc标准中?%parse param不在,并且它不会与所有的yacc实现一起工作。另一方面,没有任何东西将bison链接到Linux,而且bison本身是非常
我的解析器是针对汇编程序的,这里是和文件以防万一
在本例中,所有操作都像一个符咒:
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
因此,我在.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创建的C头文件
编译需要bison和flex创建的C源文件。bison和flex创建的C源文件相互需要什么
bison生成的报头中最重要的是enum值,用于标识令牌类型,这些令牌类型是通过词法操作返回给解析器的值
标头还声明了YYSTYPE语义类型,以及具有该类型的变量yylval,用于将每个标记的语义值传递给解析器。至少,对于具有语义值的标记。类似地,如果解析器使用位置信息,则标头定义YYLTYPE位置类型以及该类型的变量y
我正在学习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 {
我正在编译一个非常旧的程序(大约2000年的wu ftpd 2.6.1),它在以下代码上失败:
cmd_list: /* empty */
| cmd_list cmd
= {
fromname = (char *) NULL;
restart_point = 0;
}
| cmd_list rcmd
;
Bison说问题出在出乎意料的“=”上,这是有道理的,因为我见过的所有其他Yacc程序(当然不是很多)都没有使
我想用bison实现json文件的语法检测器
我曾经
识别语法错误,如[“额外逗号”,],但失败。但是对象的类似模式也适用。我认为这可能与图案顺序有关
然而,当我使用
Values: Value
| Value COMMA Values
| Value COMMA error
{ puts("extra comma, recovered"); }
它成功了。我想知道为什么
Value COMMA error { puts(&qu
bison何时执行stmt非终端。当它看到哪个字符时?假设这些都是bison输入的规则,非终端符号stmt在达到EOF时立即“执行”(即:不再输入,最后一个expr已减少)
但是,你的语法有冲突。我不明白这个问题。stmp是什么?哎呀,这是个打字错误。现在我修好了
stmt : expr {printf("%d\n",$1);}
;
expr : expr '+' expr {$$ = $1 + $3;}
| expr '-' expr {$$ = $1 - $
让我们定义一种语言:
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:
%
我一直在使用lex和yacc为命令式语言编写编译器,今天我完成了语法,我在网上看到,每种语法都会有一些移位/减少冲突,特别是如果它有if/else语句,这通常被称为悬挂if-else,我的确有if/elsif/else语句,但编译时不会引发任何冲突,问题是
这是否意味着该语法有缺陷,只是因为它没有引发任何移位/减少冲突?我在这方面没有太多经验,但我找不到任何问题
如果需要更多信息,此语法中if/elsif/else语句的结果如下:
statement -> ...
-----------
这是.l文件
%{
#include <stdlib.h>
#include "y.tab.h"
%}
%%
"true" {yylval=1; return BOOLEAN;}
"false" {yylval=0; return BOOLEAN;}
"nor" {return NOR;}
" " { }
.
我试着用奥雷利的书来学习莱克斯和亚克。我试着按照书中的例子,但它给出了分段错误
%{
/**
* 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
lexcontext-free-grammarambiguous
我有一个家庭作业,根据定义语句的语法,我应该检测语句中的歧义
例如:
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)
我正在尝试使用flex/bison为类似verilog的语言(或者更具体地说是带有一些额外构造的verilog,用于生成verilog代码)创建一个解析器,但我很难弄清楚如何构造bison规则来处理该语言中可用的一般类型的构造
该构造的一般示例如下:
(
output wire up_o,
input wire [4:0] up_i,
///////////////////////////////////////////////////////////
// A com
标签: Bison
autotoolsflex-lexer
我有一个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
我对野牛有奇怪的问题。我是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在第
嗨,我一直在尝试创建一个简单的后缀计算器
以下是片段:
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG /* negation--unary minus */
%right '^' /* exponentiation */
%% /* Grammar rules and actions follow. */
input:
/
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
我是野牛队的新手。我写了一些规则,但我得到了很多“语法上无用的规则”
我认为“expr”导致了这个问题。请帮帮我
File :
| class {printf("accepted");}
;
class : CLASS IDENT '{' function '}'
| CLASS IDENT '{' global '}'
;
global : data_type IDENT
;
function :
|data_type IDENT'('Params')' '{'statement'
我想一起使用Flex和Bison。我在bison定义文件中声明了一个union,我将在lexer中使用它。Bison生成一个.tab.h文件,其中包含union声明(见下文)。我在lexer定义中包括了这个.tab.h文件,但是lexer操作:
yylval.stringptr = yytext;
导致编译器错误:
以下是.tab.h文件的一个片段:
为什么yylval不被认为是一个结构或联盟?我应该如何纠正这个问题?
PS:我使用--bison bridge调用了Flex,如果您使用--
经过几天的努力,我仍然无法找到如何声明缓冲区。
将flex缓冲区重定向到我的缓冲区的正确方法是什么?
我想做的步骤是:
1-无条件,不返回原始缓冲区,只需通过调用函数从图形前端永久重定向缓冲区。
2-将文本从图形前端复制到我的缓冲区(或者更好地将fely缓冲区直接复制到前端缓冲区)
3-呼叫yyparse
4-重复步骤2和3
也许声明这样一个简单的公共函数就足够了:
void setmybuffer(char *ptr)
{
yy_scan_string (char *ptr);
.... /
我正在尝试使用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
flex-lexeryacclex
我正在使用lex和yacc,我需要创建两个输出文件。我需要做什么(如果有任何函数可以生成多个文件),以及如何命名每个文件
使用lex和yacc,我需要测试一个包含css的html文件,并从中生成两个文件,一个包含html,另一个包含css。基本上把css和html分开,放在不同的文件中
如果有人能提供一个如何生成两个输出文件的简单示例。您的问题有点宽泛,但正如收到的评论所表明的,也有点模棱两可。不过,我想我理解你的要求。首先,我将解决这个模棱两可的问题,然后开始解释如何实现你想要的
你似乎忽略了
当我读一本关于bison的书时,我正在和它闲逛,我正在做一个简单的中缀计算器,在这里我使用语法来指定优先级,而不是使用%left/%right和这些声明的顺序
我见过的大多数野牛计算器都将阶乘作为函数而不是运算符,所以这些例子并没有什么帮助
目前我有:
15 calclist:
16 | calclist expr EOL { printf(" = %d\n", $2); }
17 | calclist EOL { /* nada */ }
18 ;
19 expr:
2
编译bison 3.2时出现以下错误
ar: two different operation options specified
你知道吗?
我正在使用gcc 6.3.0构建Bison。得到了答案,我们需要应用以下补丁
我们需要查看错误前的行,以找出您收到该消息的原因。
我正在使用Bison和flex创建我的C编译器的语法。
在运行bisonflex和Gcc之后。一切都很好。
当运行解析器时。第一行输入正确工作;但在输入的第二行中,它抛出以下bison yyerrorerror消息:
分析错误,应为“$”
我没有带美元符号的代币
为了简单起见,我选择不显示y代码;但如果你需要看,我可以编辑。我只想知道这个错误消息的原因
编辑:添加野牛代码
%{
#include <string.h>
#include <stdio.h>
#includ
下面的语法遇到了悬而未决的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/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语法中的字符串?比如说,一个像“polySphere”一样代表自身的字符串。我是否必须在.lex文件中创建一个类似POLYSPHERE的令牌,然后在bison中使用它?我不能直接使用字符串吗
谢谢您无法在语法中识别字符串。您将出现如下错误:
不支持多字符文字标记
你应该简单地添加你的lex
“polySphere”{return polySphere;}您可以逐个字符识别bison中的字符串,例如:
polysphere: 'p' 'o' 'l' 'y' 'S' 'p' 'h'
flex/bison是否适合解析包含N个顶点的数据结构,这些顶点由表示x、y、z坐标的三个浮点数组成,而N是事先已知的?如果是这样,解析器/词法分析器的设置会是什么样子
需要填充的结构(将创建这些结构的数组)
输入文本
Vertices: n
x1 y1 z1
x2 y2 z2
...
xN yN zN
我假设的是真的(flex/bison的新产品可能是错的)
解析器定义中定义的标记
词法分析规则
你没有把你的语法文件;所以,我猜是这样的:
%{
int num_vertice
翻译方案:
expr -> {print("+")} expr + term
| {print("-")} expr - term
| term
term -> {print("*")} term * factor
| {print("/")} term / factor
| factor
factor -> digit {print(digit)}
| (expr)
上述语法将以前缀形式打印表达式。对于这种语法
标签: Bison
shift-reduce-conflictshift-reduce
我已经转移/减少了野牛的冲突
我检查了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
我想做一个简单计算器的解析器,但我无法理解为什么简单输入会出错。
Flex文件如下所示
%{
#include "exp.tab.h"
#include <string.h>
%}
blanks [ \t\n]+
%%
{blanks} { /* ignore */ }
[0-9]+ {yylval= strtol(yytext, NULL, 10);
return(NUMB);}
%%
我收到错误消息。为什么会发生这种
我的Parser.y文件包含以下代码
%defines "Parser.h"
我已经编译了这个文件,我有一个下面的错误
$bison解析器.y
Parser.y:27.10-19:语法错误,意外字符串
所以我已经发表了这一行评论
//%defines "Parser.h"
我编译了这个文件,并没有错误,但它并没有生成输出头文件
我改变了编译选项
$bison Parser.y--defines=Parser.h
这是成功的,但我不想使用选项与“野牛”命令
换句话说,我想在bison文件中使用
我正试着写一种类似Forth的语言。第二个声明工作得很好,但我在使用它时遇到了麻烦。
在“Official”中,第四次调用是原语地址列表,而在我的方法中,第二次调用是一组调用,而不仅仅是地址。e、 g.内存中声明的MYFUNCTION如下所示:
MYFUNCTION:
call primitive_foo;
call primitive_bar;
....
call primitive_foobar;
return ;
声明如下:
stmt:
V
我有一个野牛语法,这是一个适当的子集。
Bison报告有76个轮班/减少冲突。在浏览了各国的产出后,我只发现9个国家是因为我对报告的解释有误
运行一套GTest单元测试,应涵盖所支持的词汇结构,其中4个测试间歇性失败,并出现意外的标记错误(对于每个失败,每次都是相同的意外标记)
我在一个循环中运行了大约8小时的测试,每个测试失败了3次
有没有人能提供一些关于Bison中可能提供的任何选项的建议,以帮助获得更多调试信息来尝试和跟踪这些选项
我启用了跟踪解析,但它们很少失败,因此在输出中查找相关信息
标签: Bison
spaceflex-lexerignorebisonc++
我正在尝试分析以下行:
BEGIN WRAP WIO3
NAME lgCell_prg160_io
CONDITION UNI_PLACE_GLOBAL && compBits
ENDS WIO3
我用来解析上面几行的语法一直解析到UNI\u PLACE\u GLOBAL,然后给出解析错误
请帮我找出我犯的错误
我认为它不接受空格,所以我如何
我正在尝试使用flex和bison实现一个多类型计算器。
我的问题是如何写出符合我目标的语法
例如:5+3.4,结果应该是一个浮点数。
5+5,一个整数结果。
...
etc这是另一个可能相关的先前答案的可能重复:
我正在尝试编写一个yacc程序,它从用户那里获取其运算符的优先级,然后使用这些优先级规则来计算中缀表达式
我尝试通过使用%left旁边的字符变量来定义优先级,然后在调用yyparse函数之前将这些字符变量分配给我想要的运算符。比如:
%left op1
%left op2
%left op3
%left op4
如果直接给出编译错误和shift/reduce错误警告,则无法工作。我也读过关于%prec的文章,但我认为我不能用它来解决这个问题。简单的方法是让lexer根据优先级返回一个合适的to
在SO的帮助下,我正在使用Bison编写一个可重入解析器,但实际上还没有彻底测试可重入部分。我刚刚查看了Bison生成的.tab.c文件,惊讶地发现%{}%或各种%code部分中的所有代码都是全局的。我希望它们是yyparse()的本地对象
我假定在解析器中本地使用的任何变量都必须使用%parse param进行传递。
令人惊讶的是,%代码没有引用可重入用法
例如:
%{
mystruct *someStruct;
}%
因此,yyparse()的多次调用将引用
我是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 页