Bison 野牛如何写规则?

我有这样一条规则: A --> a B A --> errorCase B --> a1 C | a2 C | a3 C B --> errorCase C --> a4 D | a5 D | a6D D --> d D -->errorCase A-->A B C d,其中A、d是终端符号 和B、C是非终端符号 B --> a1 | a2 | a3 C --> a4 | a5 | a6

Bison 野牛LALR转移/减少冲突

我最近又拿起了野牛,但我仍在为优先权的工作方式以及如何解决基本的转换/减少冲突而斗争。我对编写语法规则和递归的工作原理等都很熟悉,但我仍然无法理解优先规则 我非常感谢对以下例子的一些评论,以及我对它们的问题和理解 test1.y %token ID %token TYPE_NAME %token ASTERIX %nonassoc F_T %nonassoc P_T %% f

Bison 为什么返回的值不止一个令牌?

我想返回dollard($foo)和DOTID(.foo),所以我创建了tow规则(我的lex文件的代码片段): 我编写了一个测试文件test.vm #set($arr = [1..5]) #set($hell = "sinory") $hell $arr 当我运行它时,部分结果是: 第1行是lexer打印的,没错 第2行由bison打印,超过两个字符(“=”) 因为flex需要的不仅仅是令牌 我不知道为什么?请帮助我解决它。问题是yytext仅对单个令牌有效,并且将被下一次读取的令牌覆盖或

Bison:无缘无故地获取语法错误

我已经写了一个flex/Bison语法,它可以完美地工作到某一点。 但是,当我添加一个新的非终结符和一个新的语法规则时,不管是哪一个,我都会得到以下警告:警告:语法中的规则无用[-Wother] 当我将同一条规则移动到另一个非终端时,它可以正常工作。 就像我不能再添加任何非终端一样 这是代码中不起作用的部分: %type<number> expression %type<arr> array array: '[' expression ']'

Bison 简单解析器生成器的yylex错误

我只是在做一个家庭作业,我要做一个简单的多项式解析器生成器。因此,它必须接受赋值,比如:a=2x2+2,也必须接受赋值,比如[2]将打印10。如果单独输入a,则应打印2x2+2。它应该适用于任何多项式。我应该使用的另一个文件中定义了一个typedef结构: typedef struct Polyn { int sign; int coeff; int exp; struct Polyn *next; } Polyn; lex文件: %option noyywrap %{ #i

如何获得';预期令牌';在bison/yacc-GLR解析器中?

如何在bison/yacc-GLR解析器中获取“预期令牌” 嗨 在我正在做的项目中,有几个模棱两可的gramar。所以我尝试使用%glr解析器来解决移位/减少冲突 当我使用非GLR解析器时,我可以在检测语法错误时使用yystate(全局变量)来获取“预期令牌”。但是在切换到GLR解析器后,我发现它不再是全局变量 所以我的问题是,当出现语法错误时,GLR解析器中是否有获取“预期令牌”的方法?GLR解析器中没有有效的yystate信息是正确的,因此不可能有“预期令牌”的简单解决方案 了解为什么必须理

Bison 关于班次/减少的警告

我编写了一个flex/bison prog语言解析器。目前几乎完成了(我相信已经完成了,只需要处理语法错误)。在特定的类中,会出现一些奇怪的问题 我相信问题在于解析器。我停止阅读编译控制台,今天,我回到它,看到了一件坏事: parser.y: conflicts: 801 shift/reduce, 237 reduce/reduce 之后,我重新开始构建解析器,并读取结果,以便在完成后立即发现问题 input: | input expression { std::cout <&

语法分析中的bison错误

我对此有点困惑。。。我对野牛的语法如下 %% program: | program func_defn ; datatype: INTEGER { $$ = currentType = Type::IntegerTy; } | FLOAT { $$ = currentType = Type::FloatTy; } | VOID { $$ = currentType = Type::V

Bison “野牛抱怨”;冲突:1移位/减少“;

野牛抱怨“冲突:1班/减少”。我看不出有什么问题。请帮忙。谢谢 %token OR AND NUMBER %% search_condition: | search_condition AND search_condition { printf(" AND "); } | '(' search_condition ')' | predicate ; predicate:

Bison 野牛报告错误机制可以被覆盖吗?

我注意到Bison使用了一条特定的错误消息,该消息通过yyreportSyntaxError()传递给yyrerror()函数。这是使用glr.c生成的函数 有没有办法修改此函数的行为 一种解决方案是修改yyrorm()中的错误消息。但是假设我想避免这种情况,我可以指示Bison使用我自己的函数而不是yyreportSyntaxError()?() @博特写道: 我不是野牛专家。但就手册和o'reilly Bison/Flex手册而言,使用yyerror()是一个不错的选择。但是,如果您使用类似

从bison解析器生成的内容绘制c程序的控制流图

我必须设计一个解析器,用流程图显示c程序的控制流 我使用bison生成了一个c解析器和lexer 但我不知道如何使用生成的解析器和lexer生成上下文流图。 我将如何保存解析后的内容…对我来说,这听起来像是一门课程 DOT()是一个很好的图形包,它解析文本文件并从中生成图形。然后,使用解析器在内存中建立一个中间表示,查找main,并遵循控制语句,以DOT可以识别的形式输出谁被调用

Bison 吉森算子优先

我正在使用Jison开发一种语言,遇到的一个问题是运算符优先级。我希望比较运算符是第一个要评估的运算符,因此,例如,1+2

Bison Yacc/lex结束太早,EOF/语法问题

顺便说一句,我知道这不是我所做的最好的代码,但无论如何,与问题无关 我有一个yacc/lex程序,但我只能输入一行,然后就结束了。我的意思是,我启动程序,我输入一行,然后按enter键,程序工作(显示结果,没有问题),然后我输入另一行,然后按enter键,程序不再工作,并说“错误”,程序结束。 这是预期的,因为语法规则不预期这种情况,因此,它应该在\n结束。 但我不知道如何修复它=/ 在y文件中 在l文件中 我试图用它来改变文法的开头,以便在结尾处写end时结束它。但它并没有修复它,因为结果

Bison BNFC生成的C解析器中的内存管理

我使用BNFC生成解析器BNFC-m-c./mylang.cf。在内部,BNFC makefile调用bison来生成C解析器 Parser.c : mylang.y ${BISON} ${BISON_OPTS} mylang.y -o Parser.c 我可以通过调用下面生成的psProc方法成功解析源代码 /* Global variables holding parse results for entrypoints. */ Proc YY_RESULT_Proc_ = 0; /

Flex和Bison:无法分析完整的脚本文件

我正在尝试使用flex和bison编写扫描程序和解析器来解析一个简单的脚本文件。我只能解析脚本文件的第一行。之后,程序终止时出现错误“yyerror:语法错误”。如何使程序继续执行脚本中的下一行 我正在使用Window7和下面的编译选项 汇编: flex lex.l bison -d yacc.y g++ lex.yy.c yacc.tab.c -lfl -o scanner.exe 这里我附加了.l、.y文件和script.txt文件 文件:lex.l %{ #include <

Bison 减少/减少C样式强制转换操作符中的冲突

我正在为某种查询语言编写bison+flex解析器,需要向其中添加一个C风格的cast操作符。以下是守则的相关部分: %token <characterToken> Identifier %token <commandToken> LRPAR RRPAR %type <characterToken> typename %type <operationValue> generalExp castExp variable %% ge

Bison 如何转义flex关键字

我在Linux上使用Flex&bison。我已进行了以下设置: //代币 创建{返回标记::创建;} SCHEMA{return token::SCHEMA;} 记录{返回标记::记录;} [\u a-zA-Z0-9][\u a-zA-Z0-9]*{yylval->strval=strdup(yytext);返回标记::NAME;} … //规则 创建架构名称… 创建记录名。。。 一切都很顺利。但是如果用户输入:“创建模式记录…”(其中“记录”是要创建的模式的名称),Flex将报告一个错误,因

bison没有创建tab.h文件

我是flex和bison的新手,我已经在这个项目上工作了几天了。我有一个bison文件,它以前工作正常,我对它做了一些修改,现在它没有创建tab.h文件。。。我把错误和我的bison和flex文件都放在下面。。。 错误: .y文件: %{ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define YYSTYPE double int yylex(void); static void

YACC/Bison中的错误检测/恢复

我一直在阅读有关使用错误符号yyerrok等的手册。。我关心的是如何向解析器添加错误规则,而不必过度添加或添加不足 考虑到我将解析一个简化的Java程序,我应该遵循什么一般准则?每个规则是否都应该包含一些错误检测/恢复?是否有一种最简单的方法能够熟练地完成这些任务?我现在只查找语法错误 感谢您提前给出所有答案。通常,您希望在yacc/bison文件中节省使用错误恢复规则。最好只有一个或两个顶级错误规则,而不是在叶产品中有很多错误规则,因为在叶规则中正确地重新同步实际上是非常困难的 对于类似Jav

更改bison错误消息的格式?

有没有办法改变Bison错误消息的格式?例如,不要说语法错误,而是说意外的T_ID,应该是“;”或者说IMPORT说意外的id,应该是分号,或者IMPORT——像$end这样的东西更是如此 我知道在最坏的情况下,我可以做字符串操作来修复字符串,但这似乎有点荒谬。为了得到更好的结果 syntax error, unexpected T_ID 而不是 %token T_ID 做 信息将是 syntax error, unexpected identifier 在$end的特定情况下,请执行以下

Bison解析器中的单字符文本

我试图在bison中创建一个解析器,当我在解析器中使用某些单字符终端时,它会给我带来非常奇怪的编译错误 这项工作: nonterminal1: 'a' nonterminal2 'b'; 但这并没有编译: nonterminal1: '{' nonterminal2 '}'; 我是否应该设法摆脱这些角色?我尝试了不少谷歌搜索,浏览了O'Reilly的《flex&bison》一书,但找不到任何相关内容。反例证明: %% nonterminal1: 'a' nonterminal2 'b'; n

Bison 野牛在非终点站工作

在我添加“float”规则之前,下面的代码是正确编译的,然后它给了我下面列出的错误。如果您能提供帮助,我们将不胜感激 %{ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define YYSTYPE double int yylex(void); static void yyerror(char *s) { printf("yyerror: %s\n", s); } %} %u

Bison &引用;expr tokens.l",第52行:无法识别的%option:可重入

我有一个名为“expr tokens.l”的文件或一个“lex”文件,当我尝试使用“flex expr tokens.l”命令进行解析时,会出现错误[“expr tokens.l”,第52行:无法识别的%option:可重入] 解析此文件将生成一个“.c”文件,其中包含我试图链接到主程序的方法的定义。我不明白这是否是野牛版本的问题,我正在使用野牛2.5.4版本或其他什么 如果您有任何建议,我们将不胜感激。可重入的%选项语法适用于Flex,即扫描仪生成器(而不是Bison,它在更高的语法级别上工作

单引号和双引号文本之间的Yacc/Bison差异

我有一个用Yacc写的语法。语法的相关部分摘录于此 postfix : primary | postfix '[' expr ']' | postfix '[' expr ':' expr ']' | postfix "." STRING | postfix '(' ')' | postfix '(' args ')' ; unary : postfix | '!' unary | '-' unary |

Bison 韩元价值';t在令牌之外的Yacc中分配

在Yacc中,我编写了一个解析器,它应该识别一个数字或字符串,并将其分配给我创建的名称标记。它似乎是在变量被赋值的情况下工作的,如果我打印它们的值,它们是正确的。但是,一旦Yacc移动到下一个标记,这些值就会被擦除,就好像从未将变量分配给它一样。规则NAME'='NAME是在规则中指定的位置,而不是在其他位置。这只是将一个名称/变量的值复制到另一个变量时出现的问题。底部是我所指内容的照片,这是我的代码: 简单 %{ #包括“ch3hdr.h” #包括 int yylex(无效); 无效错误(字符

Bison:左递归语法没有冲突

我写这段代码是为了创建一个pascal解析器。当野牛分析它时,它没有显示任何冲突,尽管它是一个左递归和歧义语法。这是密码 %{ #include<stdio.h> int yyparse(); int yylex(); int yyerror(char *s); %} %token ID; %token VAR; %token INT; %token FUNC; %token PROC; %token BEGIN; %token END; %token OPAF

Bison 野牛;弹性误差

我对bison和flex不是很有经验,我需要一些帮助 我的.y文件中有一些错误 在语法方面,它很好,当我“bison-d”它时,它会编译 但是,当我尝试使用gcc编译时,它会给我一些错误,我不知道如何解决(这里是total noob): .lex文件: %{ #include "meals.tab.h" #include <string.h> extern void exit(int); int line = 1; #define VEGETABLE 1 #define FR

Bison 将两个标记相加(整数)。野牛

我有一个简单的野牛文件和一些简单的语法。我正在获取一个无休止的表达式列表,我的目标是为表达式创建一个定义,将两个标记的值相加 在第20行,有一条语法规则显示了我试图实现的目标。不幸的是,它不起作用。如何实现此功能 野牛锉 在解析器中,您有以下内容: expr: INT PLUS INT { printf("%d\n", ($1 + $3)); } 这将获取两个INT标记的语义值并添加它们,这很好。如果这总是产生0,这意味着标记的语义值一定有问题。让我们看看相

Bison 转义字符语法

我想为允许转义标记分隔符的标记语言创建Jison(Bison)语法 这些建议是有效的: I like apples I like [apples, oranges, pears] I like [apples, oranges, pears] and [peanut butter, jelly] I like [apples, oranges, pears] \[when they're in season\] I like emoticons :-\] 这些示例可能被解释为以下内容(在JSO

Bison 改革语法以消除移位,减少if-then-else中的冲突

对于给定的语法,如何消除bison的shift-reduce冲突 selection-stmt -> if ( expression ) statement | if ( expression ) statement else statement 非常感谢提供修改语法的解决方案。您需要认识到这样一个事实:if-else案例中的中间语句不能是(或以)悬挂if结尾(if没有其他)。最简单的方法是将stmt规则一分为二: stmt -> st

bison自动生成的文件中缺少定义

我正在现有的.y文件中添加新规则。由于我没有更改相应的.l文件中的任何内容,所以我只使用bison编译.y文件。以下是我的步骤: 使用以下命令编译:bison-d-l-p“glbSipParserAcceptContact”AcceptContact。Bison编译它并生成相应的.c/.h文件 在Visul Studio中构建库,它会给我一个错误,即一些令牌没有定义 将自动生成的.c/.h文件与其存储库中以前的版本进行比较,我发现确实缺少这些定义 我不知道为什么!my bison的版本为1.87

Bison 在递归规则中组合相似的构造

这适用于Jison中的解析器,但我想Bison也是如此 我有一个对表达式有定义的规则 expr : NUMBER -> { type: "number", value: $1 } | "(" expr ")" -> $2 | expr "+" expr -> { type: "+", left: $1, right: $3 } | expr "-" expr -> { type: "-", left: $1, right: $3 }

Bison 需要帮助确定“的原因”;键入“默认操作时碰撞”;

我一直在做一个学校作业,很难找出是哪个问题导致了下面的“默认操作类型冲突”的多个警告。任何帮助都将不胜感激 收到的警告: parser.y:62.9-23: warning: type clash on default action: <value> != <> parser.y:71.9-16: warning: type clash on default action: <value> != <> parser.y:82.5-23: warni

Bison 如何将预处理器添加到flex+;野牛装配工?

我用flex+bison编写了一个简单的汇编程序。我想在汇编语言中添加一个预处理器(宏)。这是我第一次尝试使用flex+bison,我不知道该怎么做 添加一个单独的flex+bison实例并完全单独进行预处理是否合适?或者它们是否支持为不同的处理阶段表达不同的结构 如果好奇的话,请访问DCPU-16体系结构。您肯定需要一个单独的解析器。gcc就是这样做的——您可以在预处理之后停止编译(-E,我相信)。从技术上讲,可以作为单个解析器编写,但这会带来更多的麻烦,而且我看不出它有用的具体原因,而将其分

Bison 野牛错误处理

我对Bison的错误处理有问题。我有以下语法(我只删去了相关部分)。如果字符串“CONFIGPARAM”被解析,Flex将其令牌发送给Bison并返回终端符号“KW_CONFIGPARAM”。IDENT是指向C++字符串对象的指针。 statementlist : statement ';' { $$ = new string("statementlist"); } | statementlist statement ';' { $

Bison 野牛只读一行

我正在用flex和bison做一个简单的计算器,但它只读取输入文件的第一行。 这是我的野牛代码: %{ #include <stdio.h> #include <stdlib.h> #include <math.h> #include "symtab.h" extern int yylex(void); extern char *yytext; extern int num_linea;

Bison 如何使用dev-cpp在windows10上编译lex-yacc文件?

我遵循了此处描述的所有步骤: 但我得到了这个错误: 您收到的消息只是来自C编译器(gcc)的警告,不是致命错误。如果在命令提示下键入hello调用二进制文件,程序将正确执行和运行 您可以通过将其添加到Hello.y文件的顶部来消除警告: %{ #include <stdio.h> #include <stdlib.h> %} %{ #包括 #包括 %} (这似乎是您链接到的答案中的遗漏…)问题在于hello.y,而不是hello.l,从错误消息中可以明显看出。无需担心

Bison-语法中的非终结符

我试图用Bison创建一个简单的语法,但是我得到一个警告,非终结符是无用的加法表达式 我的代码如下所示: %% multiplicative_expr: CONSTANT_INTEGER | multiplicative_expr MULTIPLICATION CONSTANT_INTEGER ; additive_expr: multiplicative_expr | additive_expr ADDITION multiplicative_expr 我见过很多类似的问题,我认为这是因为

Bison 减少/减少野牛语法中的冲突

以下bison语法产生reduce/reduce冲突: %token LEFT_PARENTHESIS %token RIGHT_PARENTHESIS %token NAME %token RELATION_INFIX %% formula: term RELATION_INFIX term | NAME | LEFT_PARENTHESIS formula RIGHT_PARENTHESIS ; term: NAME | LEFT_PARENTHESIS term RIGHT

Bison 从Flex输出中删除默认YY_DECL

在手动设置编译器读取头文件的顺序时,我能够避开这个问题。在这种情况下,我可以用正确的定义欺骗默认的“pearl”,但当我无法控制头的包含顺序时,这。。。工程表面的天才: /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 /* %if-c-only Standard

Bison yacc中结构的正确使用

请帮忙!我是一个新手,我正试图用flex bison编写一个解析器,我被要求使用一个记录类型,我不知道为什么在我尝试使用它的时候,第一次和第二次使用它,我猜是类型happendi中的冲突,它给了我这个错误列表 这是文件global.h struct Point{ int *x; int *y; }; typedef struct Point Point; #define YYSTYPE Point extern YYSTYPE yylval; 知道一个图形可能有3到4个段,这就是要解析的文本类

Bison 使解析器忽略行注释(尾随注释除外)

我正在使用(Bison的Javascript版本,非常类似) 客观的 我想解析输入并获取有效的标记(标识符和尾随注释) 我的定义 标识符 一个单词包含字母表 一条行注释 以--和零个或多个字母开头的一整行;或 一整行,以一个或多个空格(空格、制表符)开头,后跟--和零个或多个字母 一条尾随注释 以--开头但在标识符之后的字符串 为简单起见,假设我有一个要解析的输入文件: 输入 为了解析上述内容,我编写了Jison/Bison文件(见下文),但它不完整,只解析非注释内容,即: 输出(

Bison LALR(1)对百分比和mod使用%移位/减少错误

我开始了一个使用%(以及单词mod)作为模运算符的语法项目,现在我想添加%,作为后面的一元运算符除以100 注意,我不使用基于C的语言,我使用bison的XML输出实现了自己的标记器/编译器。我选择的步骤对我的实现至关重要 有没有一种方法可以使我的语法在LALR(1)编译器中编译而不发生任何移位/减少错误 以下陈述基本上都是有效的: 5%->0.05 5%%5->0.05 mod 5 5%%%5->0.0005 mod 5 等等 我只是不知道如何在我的语法中表达: %token S_NUM

yacc/bison的最大咀嚼规则——似乎是最小咀嚼

我试图在大型/复杂语法中引入一种新的语言结构。我知道这会使语法变得模棱两可,但我希望用“最大咀嚼”规则来解决这个问题。也就是说,把我的构造放在第一位,所以它是按优先顺序取的。我取得了一些成功,但树上的其他部分没有那么多。考虑: ( 1, 2, 3 ) // triple ( 4, 5 ) // twople ( 6 ) // *not* a oneple, see below () //

Bison 何时释放内存?

我正在使用Bison和Flex开发lexer/parser组合,我有点担心内存泄漏 语法非常简单,(到目前为止)我已经能够摆脱以下定义: #define YYSTYPE char const * 在Flex中,当我读取字符串时,我为该字符串分配足够的内存,然后将其复制到yylval。据我所知,这是相当标准的做法 然而,我在任何地方都找不到任何文档告诉我何时应该释放yylval中的内存 野牛会自动为我处理吗?我必须在行动结束时这样做吗?或者我应该在什么时候执行此操作?每次计算右侧时,堆栈上的RH

bison中的特定错误处理

弹性定义: "view" { return VIEW;} "cell" { return CELL;} [A-Za-z]+ { yylval.strval=strdup(yytext); return ALPHA; } [()] {return yytext[0];} 我的野牛语法: static int len=10; static char *allkeywords[10]= {"view","acload","actual","afte

Bison lexer中的条件正则表达式

我想将条件检查放在第行下面的lexer.l中。但当我试图在代码中使用管道分隔符时,我得到了未知的错误处理部分 LIMITLINEEND ((\n{2})|([a-z]))(Error : unknown error processing section) 对于起始更改,从[+-]到[-+]。我应该使用括号,而不使用空格。比如((a)|(b))

flex/bison计算器-编译错误

我试图制作一个简单的计算器,注释行以#字符开头 这是.l文件代码 %{ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "y.tab.h" char str[256]; void yyerror(char *); %} %x COM %% <INITIAL>^# BEGIN(COM); <COM>[\t\x20-\x7E]*\\\n ; <

Bison 编译器设计-计算常量值

我试图设计一个小型编译器作为一种实践形式。我还没有读过中间代码优化或任何关于优化的内容 到目前为止,我有一个FLEX/BISON文件来描述语法,我的表达式工作得很好。在这样做的时候,我想我应该像一个常量表达式一样,重复所有的加法和乘法表达式作为它们的常量等价物,并在解析它的时候计算它们的值 所以我想知道这样做是否正确?或者我应该让代码优化(当我读到它们时)处理这样的事情吗?在代码优化过程中,您可能会做得更好。例如,3+a+39可优化为a+42(无论如何,对于无符号整数算术),但在解析过程中不容易

Bison 打印出特定令牌类型的所有实例

运行yyparse后,我想打印出输入中找到的所有VARNAMEs。我对yacc变量的内部结构知之甚少,不知道从哪里查找,谷歌也没有发现任何明显的问题 我可以修改bison规则,使用C变量跟踪这些标记,因为标记会一个接一个地出现,但是出于代码清晰的原因,如果在解析后一次完成所有这些操作,那就更好了 基本原则1: [A-Za-z_][A-Za-z0-9_]*\$? { yylval.s = yytext; return VARNAME; } 基本y: %un

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