Bison YACC规则没有减少

我正在努力学习YACC,但在理解它给我的警告信息时遇到了一些麻烦。这是我文件的一部分: define_character: WORD IS STRING COLOR { printf("%s's full name is %s and thier color is %s", $1, $3, $4); }; dialog: WORD COLON STRING { printf("%s says %s", $1, $3); }; change_scene: SCENE SETSC

Bison “的含义<*&燃气轮机&引用;在莱克斯

我知道,我们可以在lex中定义一些条件,匹配: 1.<DIRECTIVE>{STRING} {printf("Matching the DIRECTIVE state!");} 2.<REFERENCE>{INTEGER} {printf("Matching the REFERNCE state!");} 3.[\n] {printf("Matching the INITIAL state?");} 4.<*>{DOBULE} {printf("Matchi

Bison 使用Flex&;的简单Java语法;野牛

我最近开始学习基本的Flex和Bison,因为我必须为简单(但不是太简单)语法制作解析器。我决定在语法中使用简化的Java语言。我制作了.l和.y文件,所有的东西都编译无误(我使用gcc进行编译)。 问题是,每次运行生成的程序时,我都会得到语法错误,即使是像这样的简单输入:private class Something{}。只有在输入空行(\n)时,我才没有收到语法错误。 我已经为此挣扎了几天,我怀疑我的语法有问题,但我似乎找不到。当然,可能还有其他问题,因为我对Flex和Bison还很陌生 任

Bison Yacc/野牛父规则

在Yacc/Bison中,我如何知道父规则以便采取相应的行动 例如: Module :ModuleName "=" Functions Functions :Functions Function | Function Function : DEF ID ARGS BODY { /* here, I would like to identify the parent rule and do something like this

Bison 解析器-移位/减少冲突

我的解析器有一个问题,这让我发疯,我想知道你们是否能帮助我 我有一套规则: exp: exp OP exp | exp OSQUAREPAR exp CSQUAREPAR | exp DOT LENGTH | exp DOT ID OPAR expList CPAR | READERS DOT INTREADER DOT READINT OPAR CPAR | DIGIT |

一起使用Flex和Bison

首先,我必须明确我是flex和bison编程的初学者 我试图编写一个代码来识别特定的声明部分。flex和bison代码可以理解其语法和逻辑,我将在下面介绍: %{ #include <stdio.h> %} [ \t\n]+ { /* Ignore all whitespace */ } var { return VAR; } real { return REAL; } boo

Bison 我的Lex和Yacc程序运行一次正常,然后在第二次尝试时崩溃?

我有两个非常小的文件(试图删除所有其他混淆的变量),分别用Lex和Yacc编写 法律: 当输入两次“a”时。我第一次按“a”时,它询问读取令牌:程序似乎运行正常,但第二次,它呕吐 我不知道为什么会这样。这是因为你的语法文件说只允许一个“a”。任何更多的都是错误,因此你会得到一个错误。你的语法规则是: butts: VAR 不多不少 因此,语法匹配的唯一有效程序是: a 任何其他输入,例如: aa 或: 将导致语法错误。您的规则非常明确地说oneVARonly;不是一系列变量;不只是几个V

Bison 野牛;柔性连杆-yylval型

我有一个学校项目,建立一个编译器。课程工作人员提供了一个头文件“proj.h”,其中包括一个结构“Node”,用于构建解析树和一组函数。 (该标题不包括节点类型的#defineforYYSTYPE,因此不应更改)。 我想在我的.lex文件中使用节点*,例如: yylval = makeNode(...); makeNode的定义: Node *makeNode(const char* type,const char* value, Node *child); 我尝试在.lex文件和.ypp中

flex和bison如何确定句子是否是语法的一部分

我刚开始使用flex和bison,我已经实现了一个简单的计算器。我试图确定输入是否是语法中的一个句子 例如,如果我输入:a=2;b=3;打印a+b 它会返回:“a=2;b=3;打印a+b;是一个句子” 现在它实际上会做计算器,但我不关心实际的计算,我只想知道输入是否是语法中的一个句子 我真的不知道该怎么做。任何帮助或提示都将不胜感激 我的flex代码是: %{ #include "y.tab.h" #include <stdlib.h>

Bison “弹性投掷”;flex扫描仪中的输入失败”;在解析整个文件之后? 我试图用Flex和BySon在C++中进行解析器。我在网上看到“flex scanner中的输入失败”只出现在为解析提供错误文件的帖子中。但是在我的整个文件正确解析后,我得到了这个错误。是否存在flex无法正确检测EOF的错误?以下是相关定义:

野牛 %union { char node; char gate; int index; } %token END; %token <node> NODE; %token <gate> GATE; %token <index> INDEX; %% atpg: body END { cout << "Reading last line." << endl; }; body: assignmen

Bison flex';s无法识别的规则(关于可选短语)

我编写了一个简单的flex文件: %{ #include "question.tab.h" %} %% COMMON(/[45]\.0)? return GOTCHA; [a-z]+ return ETC; %% 并试图编译。(flex-d question.l) 然后输出如下 question.l:7: unrecognized rule question.l:7: unrecognized rule question.l:7: un

Bison 手册中Hoc1的基本Lex文件;Unix编程环境“;

在《Unix编程环境》一书中,除了编写“hoc”一章中的一个示例外,本书依赖于为所有示例编写自己的lexer 我真的很想看到第一个例子hoc1使用lex。当我尝试使用lex编写自己的代码时,程序在出现语法错误之前不会输出响应 代码可以在 这似乎适合我: hoc1lex.l hoc.y与hoc1.y的上下文差异 构建和测试 谢谢-在对您的代码进行了几次微不足道的修改后,它在我的系统上工作了。在我最初的尝试中,我遗漏了lex文件中提到“.”的最后一行。这会阻止程序工作吗?简而言之,是的。特别是,这意

学习flex和Bison需要知道BNF语法吗?

为了学习,你需要学习BNF语法或文本处理算法吗 Flex和Bison或类似的解析器/扫描仪 我计划学习flex和Bison,但我还没有编写任何编译器 水平知识,所以请告诉我是否有可能学习flex和Bison 不了解BNF语法,也不具备编译器编写水平的知识 假设您将学习BNF语法和文本处理算法,这是学习Flex和Bison的副产品。如果你碰巧在学术上学习过BNF,那么你之前的学习将对你有所帮助,但这种事先的学习对于你的目的可能不是必要的 顺便说一下,如果你的语言恰好是C++,那么通常的,现代的工具

使用Flex和Bison的DOM解析器

我正在做一个创建DOM解析器的项目。在初始阶段,我只是想知道给定文件中有多少标记。假设我有一个XML文件,其内容有点像这样:这是测试文件 ,为此,我只想解析两个标记和。为此,我使用Flex和Bison来编写语法,这样每当出现这种语法时,我都会执行我的代码。这是我的野牛代码: %{ #include <stdio.h> #include <conio.h> int yylex(); int yyparse(); FILE *yyin;

flex和bison:输出错误

我正在用flex和bison做一个复数计算器的家庭作业。但是我的程序不能给出正确的输出 .lex文件: %option noyywrap %{ #include<stdio.h> #include<stdlib.h> #include "complex_cal.h" #define YYSTYPE complex #include "complex_cal.tab.h" void RmWs(char* str); %} /* Add your Flex definit

Bison flex+;野牛,不同语法的部分

我正在flex&bison中开发一个解析器,它应该解析具有不同语法的不同部分的源代码 想想php,它只是“愚蠢地”转储所有内容,直到找到一个 它返回到转储 因此,当我处于“转储”部分时,扫描仪应该只提供原始字符串。有意义的标记(WHILE、开括号、标识符等)只应在语法部分中提供,并且\启动语法部分 我发现你可以给灵活的规则不同, 所以我基本上可以在不同的扫描仪之间切换,比如 %x semantic %x dump %% <dump>"\\" { BEGIN(semant

Bison 将右递归转换为左递归的通用方法

我最近与Flex和Bison合作。我知道,由于堆栈的大小,后一种方法通常不能很好地用于正确的递归。另一方面,大多数语法问题很容易用正确的递归来解决。有一种通用的算法可以将左递归转换为右递归。有相反的方法吗 下面是一个简单的例子: expression: number | expression operation number | expression operation openRound expression closeRound | openRound expressio

打印解析的Bison表达式

我们如何从bison获得最终解析的表达式 例: 其中A、B和C都是正确解析的整数,将打印出来 10 + 5 > 14 我试图修补YY_SYMBOL_PRINT宏和YYDPRINT,但我无法得到我想要的。跟踪将打印出所有内容,包括解析器的状态 这可以通过某种方式完成吗,或者我应该手动将每个标记添加到输出联合中的结果字符串中吗?您不能将打印语句添加到语法规则中吗?不,我需要在解析完成后访问它,它不必打印,可能存储以供以后检查。全局变量和连接将帮助您,如果您需要,为什么不将其存储在树之类的数据

我如何在flex和bison中表示以下内容?

我用下面的语法来表示数字的加法、乘法 Stmts->epsilon|Stmt E->Integer|Id|E*E|E+E Integer -> digit+ 表达式可以简化为表达式或数字或数字*数字或数字+数字 整数可以包含一个或多个数字 Id可以是一个变量,它需要以小写字母开头,后跟任意数量的小写字母或数字 但是,我也想代表 Stmt -> Id = E | Id*=E | Id+=E |print E 下面是语法 stmt: | stmt expr_stmt

为什么在编译我的bison文件时会出现这么多警告?

我正在为一种简单的编程语言设计词法和语法分析器。这是我的flex.l文件: %{ #include <cstdio> #include <stdio.h> #include <iostream> #include <stdlib.h> using namespace std; #define YY_DECL extern "C" int yylex() #include "littleDuck.tab.h" int line_num = 1; %

autoconf中的bison无法提示AC_错误

我的configure.ac是: AC_PREREQ(2.69) AC_INIT([mkbib], [2.1], [bnrj.rudra@yahoo.com]) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([1.9.6 dist-bzip2 subdir-objects foreign]) # Checks for programs. AC_PROG_CC AC_PROG_YACC #if test x"$YACC" != x"yes";

逗号移位/减少错误bison

此语法正在生成shift/reduce错误。使用-v选项运行后,它将显示状态7中的冲突 A: constant | OPENINGBRACES B C ; constant: INTEGER | REAL | CHARACTER ; C: CLOSINGBRACES | COMMA CLOSINGBRACES ; B: A | A COMMA B ; 规则8是 8 B:A移位/减少是冲突而不是错误——它告诉您语法不是LALR(1),因此bison生成的解析器可能只识别您语言的一

bison语法中移位/减少冲突的解决方案

我正在尝试为tiny Visual Basic语言编写一个解析器。 我无法解决下一班/减少冲突。我有以下规则: simple_type_name: qualified_type_name | primitive_type_name; qualified_type_name: ID | qualified_type_name PERIOD ID; primitive_type_name: BOOLEAN|CHAR|STRING|BYTE|SBYTE|USHORT

Bison 语法不明确时GLR解析器上的附加语法错误消息

我正在使用Bison 2.7编写GLR解析器,并启用%error verbose选项。当我运行解析器时,它给了我“语法不明确”的错误。Bison有没有办法给我提供更多关于语法不明确的地方/方式的详细信息?添加以下定义: #define YYDEBUG 1 ,Bison将显示所有可能导致语法不明确的解析选项 添加以下定义: #define YYDEBUG 1 ,Bison将显示所有可能导致语法不明确的解析选项 添加以下定义: #define YYDEBUG 1 ,Bison将显示所有可能导致

在打印$1时,它会打印bison中$1、$2、$3等的值

我已经用flex和bison编写了一个程序来解析文件。flex正确地返回了yylval,当我试图在bison代码中打印$1值时,它也会打印$2,$3。。 我怎样才能摆脱这个。附件是我的flex和bison代码 setuplog.l %{ #include <stdio.h> #include "setuplog.tab.h" #include <string.h> int yyline=1; %} time (

Bison模糊规则创建汇编程序语法

你好,我有一个为汇编程序定义的语法。 我在解决模棱两可的问题上遇到了困难 这种模棱两可的现象由此产生 某些操作码的间接寻址模式为操作码“(“地址”) 例如,将jmps下面的代码添加到$2AFD的内容中 jmp ($2AFD) 我允许地址为expr 但是 是一个绝对跳转子程序,价格为448A美元 我有一个规则,其中包含在“(”)中的表达式是允许的 这是我的操作码规则 opcodes: OPCODE

Bison 野牛语法执行顺序

我的语法是这样的: A : a B {int i = 0; printf("%d",i);}; B: and b B {i++; printf("%d",i);} | %empty ; 输入a和b以及b和b 产出:1230 我的问题是:如何更改执行顺序,使0123使用左递归而不是右递归 野牛完全按照你告诉它的方式执行行动。每个非终端的操作在非终端完成后立即执行 如果使用正确的递归规则: B: "and" b B 然后,外部的B动作(打印B的语义值)在内部的B动作之后执行,该动作打印后

如何使用Bison打印解析树?

我实现了一个解析器,但它不打印任何内容。如果给定的输入在语法上是错误的,它不会打印“Error”,尽管我将其包含在yyerror()例程中。此外,如果输入正确,则不会打印解析树。可能的原因是什么?我已将我的main()放在.lex文件中,而不是.y文件中。这可能是原因吗? 这是主要的方法: int main( argc, argv ) int argc; char **argv; { ++argv, --argc; if ( argc > 0 ) yyin = f

Bison Lex-识别模糊标记

全部, 在我的Lex文件中,我们将一些操作符识别为令牌,其中一些操作符是 ":p" and ":" 问题是,任何以:p开头的单词,比如“:presentation”,都不会被识别为 ':' word /*grammar*/ 由于返回的lex值“:p”作为下一个标记,将触发解析错误 如何解决这种歧义?您应该定义一个lexer规则来匹配整个“symbol”标记,例如 :[a-zA-Z_][a-zA-Z0-9_]* { yylval.symbol = strd

Bison 减少冲突

我在修正我语法中的移位减少冲突方面遇到了困难。我尝试添加-v来读取问题的输出,它引导我进入状态0,并提到我的INT和FLOAT被规则9减少为变量_定义。我看不到冲突,我很难找到解决办法 %{ #include <stdio.h> #include <stdlib.h> %} %token INT FLOAT %token ADDOP MULOP INCOP %token WHILE IF ELSE RETURN %token NUM ID %token INCLUDE

在flex/bison中提取行内容失败

我试图提取一行的内容,并在该行的输入被bison拒绝时打印它们。 我试图重现这些建议:但当输入被拒绝时,打印下一行而不是被拒绝的行,同时正确打印行数 弹性: 输出: Syntax error in line 1: else 我相信词法规则\n.*或yytext+1会将输出驱动到下一行,但哪个词法规则是正确的?之所以会发生这种情况,是因为bison使用1-token前瞻来解析。因此,只有在扫描程序读取并返回ELSE标记后,才会发现或诊断丢失的分号。在这一点上,前面的规则(期望分号或其他东西生成更

Bison 减少冲突

如何消除以下yacc文件的冲突: MATH_EXPRESSION : MATH_EXPRESSION PLUS MATH_EXPRESSION | MINUS MATH_EXPRESSION %prec UMINUS | MATH_EXPRESSION MINUS MATH_EXPRESSION | MATH_EXPRESSION MULTIPLY MATH_EXP

Bison 野牛移位/减少A:::=AA规则中的冲突

我编写了以下bison语法文件: %left '+' '-' %left '*' '/' %token NUMBER %% expr : NUMBER | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | expr expr %prec '*' /* implicit multiplication */ ; 现在,bison报告了有关expr:expr expr expr的移位/减少冲突。我已将问题提取

Flex BISON:如何定义一个句子?

在Flex中,使用[a-zA-Z][a-zA-Z0-9]*来定义单词。我如何定义一个句子? 以下是我的flex代码: %{ #include <stdio.h> #include <string.h> #include "y.tab.h" %} %% [0-9]+ yylval=atoi(yytext);return NUMBER; [a-zA-Z][a-zA-Z]* return WORD; [a-zA-Z][a-zA-Z0

Bison 野牛版本之间的差异

我不熟悉词法分析和解析器生成,我尝试直接从编译bison示例开始。这是一个可重入解析器的示例 我试着用bison的两个版本编译:2.5和2.6.5。前者可以完美地编译和执行,但后者在解析器头中包含类型yyscan\t,该类型在lexer头(lexer.h)中声明(我想这是可重入特性所必需的)。因此,它不会编译由Parser.y生成的Parser.c 下面是由2.6.5在Parser.h中生成的额外部分,它在2.5中不存在: #ifdef YYPARSE_PARAM #if defined __S

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 yacc无法分析simpe shell语法

我正在使用yacc/lex为shell编写一个简单的语法。我希望语法能够识别管道,其形式如下: command1 | command2 |……|命令n。我能够重新定义一个命令,在下面的代码中,使用简单_命令规则作为开始非结束符。但是,当我添加其他规则(simple_command_list和pipeline)来解析管道时,一切都不起作用。为了测试语法,我让yacc从以下字符串读取输入: char*input=“command1 | command2 | command3 | command4\n

Bison 如何获取或编译flex工具?

我有一个问题:我想使用flex工具 但当我从它的站点下载它时,我得到的只是源文件,而不是可执行文件 我想用它。谁能告诉我怎么做 谢谢您似乎下载了源文件。但是当您需要一个二进制软件包时,比如来自的版本,它以可执行的形式包含bison 然后您需要将bison放入make可执行文件的搜索路径中,之后make应该能够执行bison。也许可以提及您的平台(windows、linux…?)也可以参见此处的教程(如编译源代码怎么样?:)或者我想运行此命令所有:parser clean:rm parser.cp

如何在bison中显示语法的抽象语法树?

我正在用bison为一个简单的Pascal编译器编写一个语法,我想可视化我在Pascal.y中指定的语法的解析树。是否可以基于我的pascal.y文件以图形方式显示语法树?Bison的--graph选项生成一个源文件,您可以使用graphviz中的dot进行渲染

Bison 移位减少简单(?)语法中的冲突

我试图用野牛来描述一种语法,但我不确定它是否能做到。我想要的语法是: %token A B C D SEP %% items : /* empty */ | items_nonempty ; items_nonempty : item | items_nonempty SEP item ; item : B

Bison 野牛,@1和$1之间的差额

我正在编写一个Pascal编译器,并且已经有了可用的语法。现在我想从语义分析开始,但实际上不理解它在bison中是如何工作的。不知何故,我通过尝试每一个选项编写了一段工作代码,我想知道@1和$1之间的区别是什么 uint_values_split_by_comma: UINT { pas::ic_label label = ctx->tab->new_label(); ctx->tab->add_label_

在bison中完成规则后,实现语言需要多长时间?

我正在写我自己的语言,我几乎完成了野牛的规则。现在剩下的是实施右侧。大约有650行。这种语言没有C复杂,但仍然相当复杂。我没有尝试过实现这些规则,除了一个测试应用程序来学习它。我有很多缺点,但我掌握了窍门 每个规则都是一个函数调用,因此其中可能有600行是函数调用,因此可能有500多个函数。当您尝试它时,功能在哪里相当简单?这些规则或所有其他代码的大部分工作是否不在调用的函数中?这项工作是在两者之间进行的吗?编写规则很容易。 我想您正在实现一个解释器。 据你所说,似乎你已经定义了600多条规则,

Bison 野牛减少问题

我一直试图让一个简单的计算器在野牛工作,但我得到了一个减少问题 你能告诉我我做错了什么吗 %{ #include <cstdio> #include <iostream> using namespace std; // stuff from flex that bison needs to know about: extern "C" int yylex(); extern "C" int yyparse(); extern "C" FILE *yyin; void

Bison 如何解析到数据结构中以供以后执行?(柔性-野牛)

这是学校的作业。我只是在寻找一个正确的方向。也许当我看到答案时,我只是没有认出它(谷歌搜索) 我不想解析语法并立即执行{action},而是希望将所有内容都推送到数据结构中,以便以后执行。例如:如果cond stmt ELSE stmt,当正常解析时,两个stmt都会执行。我想如果我能把它放在某个地方,我就能控制发生的事情 我偏离基准了吗?完全正确 创建数据结构的常用方法是通过将$$(即产品的语义值)设置为根在该节点上的子树来构建它(作为一种树) 例如: %{ typedef struct

通过bison规则传递变量信息

假设我有以下两条规则: rule1: names INTEGER {*do something1*} names: ID | names ID {*do something2*} 如何在do something2操作中包含整数信息? 在这个特定的示例中,我想在每个ID(从名称)旁边打印信息整数。您不能在该方向传递信息。当执行*dosomething2*时,即读取每个名称后,解析器甚至还没有看到整数。整数位于输入中的名称之后,输入从头到尾都是线性读取的-前面没有

Bison 如何使用此代码为变量赋值?lex和yacc

我正在用lex和yacc编写代码,并尝试为变量赋值,例如: x=5 我的变量是[A-Za-z0-9],我的数字是整数[0-9]或浮点[0-9]+[.]?[0-9]* 我试着在lex文件中写下: alpha[A-Za-z0-9] 然后 {alpha}{yylval.id=(char*)strdup(yytext);返回id;} 我在yacc文件中写到:%union{char*id,int num} 我把它定义为一个标记,然后我试着写ID'='expr{$$=$3} 但它不起作用 法律代码: %{

Bison错误-预期$end

我正在Bison做一个解析器。在分析测试用例时,Bison给出了一个语法错误,表示它需要$end,但有更多的令牌。我在野牛手册中搜索了$end,但它似乎没有指出在什么条件下它会期望得到该标记。我使用了这种形式的递归规则 %start program %% program : rule | program rule; 定义我的语法根。Bison很高兴地匹配了规则的前三次调用,但抛出了第四次调用,说它期望$end。我如何向Bison表明它应该期望并匹配更多的令牌?听起来您的问题似

can';无法访问bison 2.6中的令牌表yytname,或者它已经不存在了?

我正在为资产交换格式构建一个解析器。我在bison文件中包含了%token table指令,但是,从flex代码中,我无法访问该表或与之相关的常量。即在尝试编译此代码时: Frame|FrameTransformMatrix|Mesh|MeshNormals|MeshMaterialList|Material { printf("A keyword: %s\n", yytext); yylval.charptr_type = yytext; int i; for

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