Bison 解决与野牛一起摇晃的问题

我的语法有以下两个标记声明: %token RP %token ELSE 这两条规则是: Statement : IF LP Exp RP Statement; Statement : IF LP Exp RP Statement ELSE Statement; 据我所知,规则的优先级由其最后一个非终结符的优先级决定。因此,第一条规则具有RP优先级,第二条规则具有高于RP的ELSE优先级。下面是bison的输出: state 73 11 Statement: IF LP Exp

Bison yacc中的EBNF分组是什么

我正在用lex/yacc编写程序语法。我有一个关于语法歧义的问题,我需要看看EBNF语法。当我搜索yacc及其声明的语义时,我看到了分组({…}),但我不知道如何初始化它。例如,选项([…])用|初始化 %token PROGRAM ID SEMICOLON program: PROGRAM ID SEMICOLON | PROGRAM ‘,’ ID SEMICOLON 有没有这样的分组方法 yacc不支持EBNF,因此需要将EBN

Bison 连接非端子以进行背面配线

idlist在这里是idtype类型。我是Yaac的新手。我是否做了一些愚蠢的事情,因为我的代码是通过一个id循环的。当我在一个级别上使用它时 因此,这里的语法在ID之后有类型。我可以使用堆栈来实现这一点,但我认为这很可爱。问题是您使用的地址是$1,这是一个仅为该规则操作而存在的本地临时地址。因此,在操作完成后,它就会消失,留下$$.ptr悬空,并指向将被重新用于其他用途的内存 idlist : idlist ',' ID { $$.str=$

未定义对`#yyerror';的引用;使用Flex和Bison编译时

我正在尝试为一种类似于微型Pascal的语言制作一个编译器。我使用Flex和Bison来解决这个问题,我发现了这个错误 我的Flex文件: %{ #include "y.tab.h" #include <stdlib.h> #include <string.h> #include <math.h> void yyerror(char *); %} %% [1-9][0-9]* { yylval.i = atoi(yy

Bison 如何在flex规则中引用lex或解析参数?

我知道我可以在.y文件中声明%parse param{struct my_st*arg}。因此yyparse()被更改为yyparse(struct my_st*arg)。但是如何引用flex规则中的参数呢?例如: [0-9]+ { do_work(arg); return NUMBER; } 我想做一个可重入解析器,所以我需要这样做。请帮帮我,谢谢 您需要将参数传递给yylex。这需要修改bison解析器描述,以便解析器使用所需参数调用yylex,以及flex scanner描述,以便扫描

Bison 用Flex/Lex识别函数调用模式

我正试图编写一个Cminus(C子集)编译器,但我的教授要求我们能够处理input()和output()函数作为系统调用(上学期我们实现了一个RISC CPU,可以处理这些指令) 对于输入()。因为这个函数应该以数组或变量作为参数,所以我假设在Lex模式上,我需要这样的东西(参考我读到的内容): 但我的语法有以下定义: type: INT | VOID; fun_decl: type ID LPAREN params RPAREN comp_decl; 其中ID是Lex给Bison的一个标记,

Bison Can';向量';是否在yacc的yylval中使用?

我想将yylval定义如下: %union { int ival; char *sval; struct s_con { char exp[30]; vector<Where*> v_wheres; } *p_s_con; } %union{ 国际竞争力; char*sval; 结构s_con{ char-exp[30]; 向量v_在哪里; }*p_s_con; } 这里是,其中是一个类。 然后我在y.tab.

Bison 野牛c码赋值

如果循环结构在*.y文件中定义为: WHILE '(' expr ')' stmt ENDWHILE { //to be written here loop structure handling - put WHILE into structure stack } 然后-尽管我被迫使用ENDWHILE-我如何将c代码绑定到ENDWHILE以检查结构之间是否存在重叠?只有在识别所有以前的标记和规则(以及执行任何代码)后,才会执行示例中大括号中的代码 如果您有嵌套的WHILE/ENDWHILE循环

Bison 如何使用calc++;野牛提供的例子?

我是使用bison和flex的新生。 我下载了gnu bison官方网站提供的软件包。 有一个例子文件夹包含C++中的计算器的源代码。 以下是下载链接: 我采取了以下行动: bison-d calc++-parser.yy=>OK,生成calc++-parser.tab.hh和calc++-parser.tab.cc flex-calc++-scanner.ll=>OK,生成lex.yy.c cc-o a.out lex.yy.c calc++-parser.tab.cc-lfl=>失败 我不知

Bison 无法识别Flex lexer启动条件

我有一台扫描仪,它保持两种独占状态(WORD和DEFN) %选项noyywrap %s字 %s DEFN %% %{ 开始(单词); %} { “|”{BEGIN(DEFN);返回WS_PIPE;} } { [^;]+{printf(“ds:%s\n”,yytext);返回WD_STRING;} “;”{返回WD_分号;} } \n |。{printf(“U:%s\n”,yytext);} %% 但是,通过简单的输入“| some text;”,当解析管道时,状态没有改变,因此对“some t

Bison 野牛';新加坡元<;num>;$您是否>;?

我研究了Bison的语法,有一个关于一些结构的问题,比如 bodystmt: { $<num>$ = parser->line; } bodystmt: { $$=解析器->行; } 我知道$$和$1,num是一种类型。。但这对我来说是一个新事物,它是一个显式的类型标记,覆盖该值的声明类型。因此,如果你有: %union { int num; char *str; } %type<st

Bison 野牛移位/减少误差

我在野牛身上犯了一个错误,我不知道如何纠正 在尝试编译语法时,我遇到1个shift/reduce错误: START: type_specifier MAIN LBR_R RBR_R LBR_C program RBR_C program: statement ; type_specifier: INT | DOUBLE | VOID; var_declaration: type_specifier var_declist SECOLON; var_declist: var_decli

Bison lex&;yacc文件

我对莱克斯和亚克还很陌生。我正在尝试一种语法来识别输入文本:escliver 1或ESCRIVER 1+2但每次我尝试它时都会显示语法错误,我认为问题在于解析数字或单词escliver 这是我的flex/lex代码 %{ #include "gram.h" int yyerror(const char *s); %} /* letras [A-Za-z]+ */ /* id ({letras})({letras}|{digito})* */ %% "ESCREVER"

Bison 野牛-转移/减少冲突

我知道在Bison代码中,可能会出现一些移位/减少冲突,正常的C语法会为if/else生成一个移位/减少冲突。然而,我有一个语法,可以产生330个其他移位/减少冲突。这表明我的语法有严重问题吗?我是否应该花时间查找每个冲突并尝试解决或验证其正确性?我正在使用一个常规的LALR解析器 编辑: 这是我的语法,我去掉了所有的动作和其他东西 %token STRING_LITERAL %token INTEGER %token FLOAT %token CHARACTER %token PTR_OP I

构建解析树时出现flex yacc(bison)分段错误

我在逻辑运算符方面有问题 在我的.y文件中,我有: expr: expr oper1 expr { $$=insert_expression($2, $1, $3); } | expr oper2 expr { $$=insert_expression($2, $1, $3); } ; 在我的.l文件中,我确定oper1和oper2是: "<" | ">" | "=" | "<>" | "<=" | ">=" { return oper1

Bison 野牛,规则开始时的行动

我正在尝试为C语言的一个子集构建语法。在我的一些规则中,我有以下内容(pNode是在union中定义的指针): 规则:{$$=$0;}其余的 但是,在阅读Bison文档之后,似乎可以忽略该操作,因为$0已经引用了堆栈中的前一个符号。我说得对吗 如果能够省略该操作,那就太好了,因为它会导致一些原本不会出现的移位/减少冲突。此代码复制值堆栈上的顶部值(对于此规则,使复制的$1),因此,这可能是不必要的——如果所有使用其中一个复制值的代码都可以更改为使用未复制值,并且如果没有任何代码尝试修改堆栈上的

Bison Byacc$$未键入,如何解决

我正在使用byacc来构造语法,但是当我想使用yyerrok时,它对我说byacc:e-line 44 of“bee.y”,$$是非类型的 如何解决这个问题?() @格雷兹写道: 您收到此消息不是因为yyerrok的使用。原因是$$=0,即您没有将类型分配给非终端定义(如@templatetypedef所述)。您可以将每个生产关联到一个操作。每个动作都可能返回一些语义值,这些语义值可用于“更高”的生产。此外,您可以(或应该)为每个非终端和终端指定语义值的类型。看看bison doc:,特别注意语

Bison &引用;“语法分析器中的规则无效”;连续使用两个运算符

我想用一个操作符编写一个语法,比如Matlab冒号操作符,其中“a:b”和“a:b:c”的意思稍有不同。我更希望操作符是非关联的,因为“a:b:c:d”等没有意义 下面是我语法的精简版本,以展示我是如何尝试做到这一点的: %union { int ival; } %token tINT %nonassoc ':' %% program: { } | expression ';' { } expression: tINT { } | expressi

Bison 如何在JISON中定义字符串

我刚刚开始编写DSL,希望使用JISON()。我试图学习语法,但在双引号中指定字符串时遇到了问题 我认为有效的方法是: %lex %% [\n\s]+ /* skip whitespace */ "true"|"false" return 'BOOL' "IF" return 'START' "AND"|"OR" return 'LOGIC' <<EOF>>

Bison 奇怪的移位/减少明确(我认为)语法的冲突

因此,在我的语言中,我希望有点语法表达式: myObject.myProperty myObject.myProperty.subProperty 我想要声明 Object myObject = 1 此外,对象类型可以使用名称空间: Object.SubObject mySubObject = 1 简化语法如下: program: declaration; | expression; declaration: TOKEN_IDENTIFIER TOKEN_IDE

Bison在规则完成后接受输入

我想为单个查询解析文本。此查询将以分号结束。它将类似于sql。例如:创建表'somename' 我的y文件是 %{ #include <stdio.h> #include <math.h> #include <stdlib.h> #include <stdbool.h> #include "ast.h" extern int yylex(void); extern void yyerror(char const *msg); QueryNode

Bison 野牛如何解析x=(int)和#x2B;B

假设“int”是一个类型,第一个表达式是类型转换,第二个表达式只是一个简单的加法,或者如果“a”是一个类型别名,那么bison将如何解析/解决这个表达式中的冲突,我感到困惑。假设该语言允许为现有类型指定别名 x = (int)+b => typecast to "int" the "+b" x = (a)+b => addition expression / typecast to "a" the "+b"

Bison 如何在解析器和lexer之间分离职责以匹配文本块?

我有一个文本文件,我正试图解析它。该文件如下所示: A_1: - A_10: Some text. ---------- Some more text. __________ B_1: - B_5: Still more text - it may contain dashes as well. ---------- Even more text. Could be multiple sentences with newlines. Like this. __________ 等等 我试图在

我如何告诉bison有语法错误?

具体情况是,在分析AST之后,当规则完成时,我将知道是否存在错误。我尝试了一个错误(“胡说八道”),但没有成功 因为我不能告诉它有错误,它完成了另一个规则,现在有一个reduce/reduce冲突。这很烦人,因为我知道其中一个是无效的,而不看另一个,但用户必须忍受bc我不知道如何说忽略这个分支bc无效 如何解决此问题?您需要创建一个没有减少/减少冲突的语法您想要的yyrorm不是yyrorm——将yyrorm放入一个动作会导致解析器将该动作设置为语法错误,并进入错误恢复模式(如果您的解析器中有任

Bison 野牛误差输出

我使用的是Bison,生成了一个相当复杂的语法。问题是我的第一个测试用例失败了——但Bison只会说“语法错误”。有没有办法让Bison输出不匹配的规则和出现问题的令牌?我曾经 %define parse.trace true 但是仍然只能将语法错误作为输出。如果将全局变量yydebug设置为非零值,bison将在运行时输出调试信息,其中包含解析堆栈的外观、状态、使用的规则等信息,这就是我通常调试此类错误的方式。使用%error verbose指令来帮助您。它将为您提供解析器所期望的标记的提示

Bison lex/yacc程序中的奇数错误

我不熟悉lex/yacc,我正在使用lex/yacc编写SQL解析器。但是对于下面列出的特定连接查询,我的解析器故意访问“select_statement”规则,而不是“nested_JOIN_statement”规则 我得到了这个查询的正确输出:从sample1中选择*JOIN sample2 ON sample1.C1=sample2.C4; 这将转到“join_语句规则”,满足中的简单_连接规则 但是当我尝试这个查询时:SELECT*FROM SELECT*FROM SELECT*FROM

Bison 用于回显列表的Yacc递归方法?

我正在努力理解yacc递归。所以我创建了一个最小的语言,我想简单地回显给它的数字列表。我用的是JISON。以下是JISON: /* description: Parses end executes mathematical expressions. */ /* lexical grammar */ %lex %% \s+ /* skip whitespace */ [0-9]+("."[0-9]+)?\b return 'NUMBER' <<

如何正确地将优先级规则应用于具有Bison的表达式?

这里是野牛新手 我正在尝试向我的玩具计算器添加一个功能,它可以在任何变量之前省略乘法运算符*,这样它就可以解析如下内容:3x*2y 我将程序简化为一个非常简单的解析器,它只支持乘法(显式和省略),其中数字由字符n表示,变量由字符v表示 下面是一个输入示例,类似于上面的示例,应该接受: nv*nv 更复杂的示例也可以使用(请忽略空白): nvv*n*nvvv 这是代码文件calc.y: %start expression %left '*' %% expression: 'n' |

flex bison:创建多字符变量

我想创建一种由多个字符变量(例如abc=10,num=120)组成的编程语言。我能够创建单字符变量。.y代码为: %{ #include <stdio.h> //char sym[1000]; //int x=0; int sym[26]; %} %token NUMBER ADD SUB MUL DIV ABS EOL ID ASS %% calclist : | calclist exp EOL {

Bison 删除可选else块上的shift/reduce冲突

我正在和Bison一起定义语法,我偶然发现了一个我想消除的移位/减少冲突。冲突是由旨在匹配if/else语句的规则引起的: state 17 13 Stmt: IfBlock . OptionalElseBlock ELSE shift, and go to state 42 ELSE [reduce using rule 16 (OptionalElseBlock)] $default reduce using rule 16 (Optiona

flex/bison中的半保留字处理

考虑这个lex.l文件: %{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "/" { return SL

Bison 在Yacc中打印伪变量

你好 我正在学习yacc,在理解某些东西时遇到了一些问题 这是我的.y文件的一部分: statement: statement expression '\n' {$$=insert_expression_list($1, $2); printf("1\n");} | expression '\n' {$$=insert_expression_list(NULL, $1); myprogram=$$; printf("1.1\n");} ; ex

如何使用纯(可重入)flex/bison解析器进行嵌套包含?

我一直在将解析器/词法分析器转换为可重入实现,最后一个障碍是能够执行嵌套的include script.txt类型指令 这是我为include位实现的:但它会seg错误,否则标记器和解析器的其余部分工作正常: ^{include}{ws}+ { BEGIN INCL; } <INCL>[^ \t\n\r\f]+ { /* Swallow everything up to whitespace or an EOL character.

用Bison解析树

我是野牛队的新手。我正在尝试实现一个解析器。我面临的主要问题是解析树。我得到一个与树相关的错误,我无法消除。上面写着“未知类型名‘tree’”。这是我的y档案。如果有人能帮我解决这个问题,我会很高兴的。我非常需要解析器。提前谢谢 %{ #include <stdio.h> #include <string.h> void yyerror(const char *str) { fprintf(stderr,"error FAIL: %s\n",str);

FLEX/BISON-如何将用户输入转换为小写?

如何在Flex中将用户输入转换为小写?在网上看了一下,但没有发现任何有用的东西 当我尝试这样做时: yylval.string = strdup(tolower( yytext) ); 我得到一个错误声明:传递'tolower'的arg 1将从指针生成整数,而不进行强制转换 谢谢, Sarah您可以在顶部的“C”部分重新定义宏: #define YY_INPUT(buf,result,max_size) \ { \ int c = '*', n; \

Bison Lexx和Yacc使用C语法将C解析为符号表

我试图用bison和lex创建一个c类型解析器。是的,这是一个学校作业,但我很迷路,我做学校在线,所以我没有得到太多的帮助。我需要它来将信息解析到一个表中,但是我很确定parse.y文件中有错误,因为它没有将信息加载到表中,它说没有代码。我知道我的.y文件缺少一些语法,但我认为其中一些应该按原样加载到符号表中 运行make文件时的输出是: default: clear yacc -d -v --debug parse.y lex -l scan.l gcc -o

Bison yacc/野牛识别行动结果

我使用Jflex、byacc、java解析语句 where expr,expr having expr 语法看起来像 %token WHERE HAVING COMMA %% stmt : whereclause havingclause whereclause : WHERE conditionlist { move tmpList to whereClause}; havingclause : HAVING conditionlist { move tmpList to havingC

Bison 野牛代码中$7和$8的含义

我正在读一些用于解析C程序的Bison代码。有人能告诉我下面代码中$7和$8的含义吗?因为我在两种情况下只找到6和7描述来描述枚举类型 enum_name: enum_key gcc_type_attribute_opt { init($$); PARSER.new_declaration(stack($1), symbol, stack($$), true); PARSER.copy_item(to_ansi_

Bison 找不到“;2规则永远不会减少“;及;冲突:2移位/减少“;在yacc文件中

当我试图“编译”我的yacc文件时,我似乎找不到上述错误。我希望有人能指出问题所在,让我知道我需要做些什么来纠正问题。我已列出我的文件: %token Identifier Int Real_Num And Array %token Begin Boolean Div Do Else %token End False For Goto If %token Imply Integer Label Not Or %token Own Procedure Real Step String %token

Bison flex正则表达式中的符号s是什么

我试图从遗留代码中理解flex规则,您能帮助我: number [0-9]*['']s?[bdh] “”(两个单引号)是什么意思?它是否意味着一个单引号,其中第一个引号符号是后面提到的实际引号的转义?我的印象是特殊字符需要用反斜杠标记,如[\']。如果“”表示,那么使用反斜杠作为转义字符的正确方法是什么 这里的“s”符号是什么意思 你能举一些例子说明这两段正则表达式在哪里匹配吗 我认为双撇号只是一个错误。括号定义字符集,撇号没有特殊含义。括号内双撇号的含义与仅包含一个撇号的字符集的含义相同,

Bison 野牛-我可以通过引用传递非平凡的YYSTYPE吗?

例如,我在.ypp中有以下声明: %{ #include <iostream> #include <stdlib.h> #include "structs.h" #include "func.h" #define YYSTYPE Types %} %union Types{ int Integer; bool Boolean; Expression Exp; }; 在“func.h”中,我有以下函数: int binop(Types& a,

FLEX/BISON: ;为什么我的规则没有重新制定?

我正试着在FLEX和BISON中做一些练习 以下是我编写的代码: calc_pol.y %{ #define YYSTYPE double #include "calc_pol.tab.h" #include <math.h> #include <stdlib.h> %} %start line %token NOMBRE %token FIN %% line: exp '\n' { printf("\t%.2lf\n", $1); }; exp: exp exp '+'

Bison 模糊语法的Yacc规则

我试图编写一个yacc语法来识别以下模式: AAAA -> Multiple As BBBB -> Multiple Bs AAAABB -> 2 As followed by (AABB) AAABBBBB -> (AAABBB) followed by 2Bs 通常,我希望将相邻As和Bs的相等块分组在一起,优先于As或Bs的运行。直截了当的语法说明了一系列冲突 我需要一种方法来优先考虑这部作品 T -> | AB | ATB 结束 (其中T和U为ya

Bison 减少-减少语法冲突

我在bison中得到了以下语法的reduce/reduce冲突,因为n也是epsilon产生式 m : {$$=line_no;} ; n : { $$.nl=makelist(line_no); codelines[line_no].opcode=GOTO;

Lex和Yacc/Flex和bison语法错误

我最近发现了lex和yacc(以及flex和bison),当我试图告诉程序是否给出了一个句子时,出现了一个错误 以下是.lex文件: %{ #include <stdio.h> #include "1.tab.h" %} %% tweety|sylvester return NP; a|the return AR; cat|bird return NC; run|fly return VI; eat|hate return VT; "." retur

Bison FLEX-在输出文件中获取奇怪的新行错误

所以我的代码有一个奇怪的问题。虽然词法分析器成功地识别了所有的标记,但当从输入文本文件读取时,它不识别新行(保持在第1行),并且在每次成功识别标记后,它都会给我一个奇怪的错误。这是我的密码: %option noyywrap %x error %{ #include <stdio.h> #include <string.h> #include <stdlib.h> #include "token.h" int line = 1; void ERROR

如何获取令牌的bison语法规则

假设我有以下规则: rule1 : TOKEN rule2 TOKEN { printf("Found TOKEN\n") ; } rule2 : ATOKEN { printf("Found ATOKEN\n") ; } 在这里,输出将如下所示: Found ATOKEN Found TOKEN 因为规则2将首先减少。有没有什么方法可以让我一拿到代币就打印一些东西 N.B我知道当它与令牌匹配时,我可以从扫描仪中执行此操作,但我需要从bison打印它。bison允许在规则内执行操作(称为)

如何在一个.y文件中处理bison版本差异?

我必须支持bison版本3.0.4和3.4.2的系统 我在.y文件中使用了变量parser\u class\u name。3.4.2不再支持此选项 error: syntax error, unexpected string, expecting identifier 它的替代品是使用api.parser.class,但这不适用于3.0.4:(请参阅Bison 3.3中引入的:History:来替代parser\u class\u name。) 如何在.y文件中解决此问题?如果在bison的语

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