我正在努力学习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
yacclexflex-lexer
我知道,我们可以在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
我最近开始学习基本的Flex和Bison,因为我必须为简单(但不是太简单)语法制作解析器。我决定在语法中使用简化的Java语言。我制作了.l和.y文件,所有的东西都编译无误(我使用gcc进行编译)。
问题是,每次运行生成的程序时,我都会得到语法错误,即使是像这样的简单输入:private class Something{}。只有在输入空行(\n)时,我才没有收到语法错误。
我已经为此挣扎了几天,我怀疑我的语法有问题,但我似乎找不到。当然,可能还有其他问题,因为我对Flex和Bison还很陌生
任
在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
yaccparser-generator
我的解析器有一个问题,这让我发疯,我想知道你们是否能帮助我
我有一套规则:
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代码可以理解其语法和逻辑,我将在下面介绍:
%{
#include <stdio.h>
%}
[ \t\n]+ { /* Ignore all whitespace */ }
var { return VAR; }
real { return REAL; }
boo
标签: Bison
flex-lexeryacclex
我有两个非常小的文件(试图删除所有其他混淆的变量),分别用Lex和Yacc编写
法律:
当输入两次“a”时。我第一次按“a”时,它询问读取令牌:程序似乎运行正常,但第二次,它呕吐
我不知道为什么会这样。这是因为你的语法文件说只允许一个“a”。任何更多的都是错误,因此你会得到一个错误。你的语法规则是:
butts: VAR
不多不少
因此,语法匹配的唯一有效程序是:
a
任何其他输入,例如:
aa
或:
将导致语法错误。您的规则非常明确地说oneVARonly;不是一系列变量;不只是几个V
我有一个学校项目,建立一个编译器。课程工作人员提供了一个头文件“proj.h”,其中包括一个结构“Node”,用于构建解析树和一组函数。
(该标题不包括节点类型的#defineforYYSTYPE,因此不应更改)。
我想在我的.lex文件中使用节点*,例如:
yylval = makeNode(...);
makeNode的定义:
Node *makeNode(const char* type,const char* value, Node *child);
我尝试在.lex文件和.ypp中
标签: Bison
flex-lexeryacclex
我刚开始使用flex和bison,我已经实现了一个简单的计算器。我试图确定输入是否是语法中的一个句子
例如,如果我输入:a=2;b=3;打印a+b
它会返回:“a=2;b=3;打印a+b;是一个句子”
现在它实际上会做计算器,但我不关心实际的计算,我只想知道输入是否是语法中的一个句子
我真的不知道该怎么做。任何帮助或提示都将不胜感激
我的flex代码是:
%{
#include "y.tab.h"
#include <stdlib.h>
野牛
%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-lexeryacclex
我编写了一个简单的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
在《Unix编程环境》一书中,除了编写“hoc”一章中的一个示例外,本书依赖于为所有示例编写自己的lexer
我真的很想看到第一个例子hoc1使用lex。当我尝试使用lex编写自己的代码时,程序在出现语法错误之前不会输出响应
代码可以在
这似乎适合我:
hoc1lex.l
hoc.y与hoc1.y的上下文差异
构建和测试
谢谢-在对您的代码进行了几次微不足道的修改后,它在我的系统上工作了。在我最初的尝试中,我遗漏了lex文件中提到“.”的最后一行。这会阻止程序工作吗?简而言之,是的。特别是,这意
为了学习,你需要学习BNF语法或文本处理算法吗
Flex和Bison或类似的解析器/扫描仪
我计划学习flex和Bison,但我还没有编写任何编译器
水平知识,所以请告诉我是否有可能学习flex和Bison
不了解BNF语法,也不具备编译器编写水平的知识 假设您将学习BNF语法和文本处理算法,这是学习Flex和Bison的副产品。如果你碰巧在学术上学习过BNF,那么你之前的学习将对你有所帮助,但这种事先的学习对于你的目的可能不是必要的
顺便说一下,如果你的语言恰好是C++,那么通常的,现代的工具
我正在做一个创建DOM解析器的项目。在初始阶段,我只是想知道给定文件中有多少标记。假设我有一个XML文件,其内容有点像这样:这是测试文件
,为此,我只想解析两个标记和。为此,我使用Flex和Bison来编写语法,这样每当出现这种语法时,我都会执行我的代码。这是我的野牛代码:
%{
#include <stdio.h>
#include <conio.h>
int yylex();
int yyparse();
FILE *yyin;
我正在用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
我正在flex&bison中开发一个解析器,它应该解析具有不同语法的不同部分的源代码
想想php,它只是“愚蠢地”转储所有内容,直到找到一个
它返回到转储
因此,当我处于“转储”部分时,扫描仪应该只提供原始字符串。有意义的标记(WHILE、开括号、标识符等)只应在语法部分中提供,并且\启动语法部分
我发现你可以给灵活的规则不同,
所以我基本上可以在不同的扫描仪之间切换,比如
%x semantic
%x dump
%%
<dump>"\\" { BEGIN(semant
我最近与Flex和Bison合作。我知道,由于堆栈的大小,后一种方法通常不能很好地用于正确的递归。另一方面,大多数语法问题很容易用正确的递归来解决。有一种通用的算法可以将左递归转换为右递归。有相反的方法吗
下面是一个简单的例子:
expression:
number
| expression operation number
| expression operation openRound expression closeRound
| openRound expressio
我们如何从bison获得最终解析的表达式
例:
其中A、B和C都是正确解析的整数,将打印出来
10 + 5 > 14
我试图修补YY_SYMBOL_PRINT宏和YYDPRINT,但我无法得到我想要的。跟踪将打印出所有内容,包括解析器的状态
这可以通过某种方式完成吗,或者我应该手动将每个标记添加到输出联合中的结果字符串中吗?您不能将打印语句添加到语法规则中吗?不,我需要在解析完成后访问它,它不必打印,可能存储以供以后检查。全局变量和连接将帮助您,如果您需要,为什么不将其存储在树之类的数据
我用下面的语法来表示数字的加法、乘法
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
我在代码中执行类似的操作
CmpExpr:
rval '<<' rval { $$ = $1 << $3; }
| rval '>>' rval { $$ = $1 >> $3; }
| rval '>>>' rval { $$ = (unsigned)($1) >> ($3); }
;
如何使用不同的代币
%TOKEN L
标签: Bison
yacclexflex-lexer
我正在为一种简单的编程语言设计词法和语法分析器。这是我的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;
%
我的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";
此语法正在生成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
parser-generatorlr
我正在尝试为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 2.7编写GLR解析器,并启用%error verbose选项。当我运行解析器时,它给了我“语法不明确”的错误。Bison有没有办法给我提供更多关于语法不明确的地方/方式的详细信息?添加以下定义:
#define YYDEBUG 1
,Bison将显示所有可能导致语法不明确的解析选项 添加以下定义:
#define YYDEBUG 1
,Bison将显示所有可能导致语法不明确的解析选项 添加以下定义:
#define YYDEBUG 1
,Bison将显示所有可能导致
我已经用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 (
你好,我有一个为汇编程序定义的语法。
我在解决模棱两可的问题上遇到了困难
这种模棱两可的现象由此产生
某些操作码的间接寻址模式为操作码“(“地址”)
例如,将jmps下面的代码添加到$2AFD的内容中
jmp ($2AFD)
我允许地址为expr
但是
是一个绝对跳转子程序,价格为448A美元
我有一个规则,其中包含在“(”)中的表达式是允许的
这是我的操作码规则
opcodes:
OPCODE
我的语法是这样的:
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
yaccflex-lexerparse-tree
我实现了一个解析器,但它不打印任何内容。如果给定的输入在语法上是错误的,它不会打印“Error”,尽管我将其包含在yyerror()例程中。此外,如果输入正确,则不会打印解析树。可能的原因是什么?我已将我的main()放在.lex文件中,而不是.y文件中。这可能是原因吗?
这是主要的方法:
int main( argc, argv )
int argc;
char **argv;
{
++argv, --argc;
if ( argc > 0 )
yyin = f
标签: Bison
yacclexflex-lexer
全部,
在我的Lex文件中,我们将一些操作符识别为令牌,其中一些操作符是
":p"
and
":"
问题是,任何以:p开头的单词,比如“:presentation”,都不会被识别为
':' word /*grammar*/
由于返回的lex值“:p”作为下一个标记,将触发解析错误
如何解决这种歧义?您应该定义一个lexer规则来匹配整个“symbol”标记,例如
:[a-zA-Z_][a-zA-Z0-9_]* { yylval.symbol = strd
标签: Bison
flex-lexeryacclex
我在修正我语法中的移位减少冲突方面遇到了困难。我尝试添加-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
我试图提取一行的内容,并在该行的输入被bison拒绝时打印它们。
我试图重现这些建议:但当输入被拒绝时,打印下一行而不是被拒绝的行,同时正确打印行数
弹性:
输出:
Syntax error in line 1: else
我相信词法规则\n.*或yytext+1会将输出驱动到下一行,但哪个词法规则是正确的?之所以会发生这种情况,是因为bison使用1-token前瞻来解析。因此,只有在扫描程序读取并返回ELSE标记后,才会发现或诊断丢失的分号。在这一点上,前面的规则(期望分号或其他东西生成更
如何消除以下yacc文件的冲突:
MATH_EXPRESSION : MATH_EXPRESSION PLUS MATH_EXPRESSION
| MINUS MATH_EXPRESSION %prec UMINUS
| MATH_EXPRESSION MINUS MATH_EXPRESSION
| MATH_EXPRESSION MULTIPLY MATH_EXP
标签: Bison
yaccoperator-precedenceshift-reduce-conflict
我编写了以下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的移位/减少冲突。我已将问题提取
标签: Bison
definitionflex-lexer
在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的两个版本编译: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
我在Linux上使用Flex&bison。我已进行了以下设置:
//代币
创建{返回标记::创建;}
SCHEMA{return token::SCHEMA;}
记录{返回标记::记录;}
[\u a-zA-Z0-9][\u a-zA-Z0-9]*{yylval->strval=strdup(yytext);返回标记::NAME;}
…
//规则
创建架构名称…
创建记录名。。。
一切都很顺利。但是如果用户输入:“创建模式记录…”(其中“记录”是要创建的模式的名称),Flex将报告一个错误,因
我正在使用yacc/lex为shell编写一个简单的语法。我希望语法能够识别管道,其形式如下:
command1 | command2 |……|命令n。我能够重新定义一个命令,在下面的代码中,使用简单_命令规则作为开始非结束符。但是,当我添加其他规则(simple_command_list和pipeline)来解析管道时,一切都不起作用。为了测试语法,我让yacc从以下字符串读取输入:
char*input=“command1 | command2 | command3 | command4\n
我有一个问题:我想使用flex工具
但当我从它的站点下载它时,我得到的只是源文件,而不是可执行文件
我想用它。谁能告诉我怎么做
谢谢您似乎下载了源文件。但是当您需要一个二进制软件包时,比如来自的版本,它以可执行的形式包含bison
然后您需要将bison放入make可执行文件的搜索路径中,之后make应该能够执行bison。也许可以提及您的平台(windows、linux…?)也可以参见此处的教程(如编译源代码怎么样?:)或者我想运行此命令所有:parser clean:rm parser.cp
标签: Bison
abstract-syntax-tree
我正在用bison为一个简单的Pascal编译器编写一个语法,我想可视化我在Pascal.y中指定的语法的解析树。是否可以基于我的pascal.y文件以图形方式显示语法树?Bison的--graph选项生成一个源文件,您可以使用graphviz中的dot进行渲染
标签: Bison
shift-reduce-conflict
我试图用野牛来描述一种语法,但我不确定它是否能做到。我想要的语法是:
%token A B C D SEP
%%
items : /* empty */
| items_nonempty
;
items_nonempty : item
| items_nonempty SEP item
;
item : B
我正在编写一个Pascal编译器,并且已经有了可用的语法。现在我想从语义分析开始,但实际上不理解它在bison中是如何工作的。不知何故,我通过尝试每一个选项编写了一段工作代码,我想知道@1和$1之间的区别是什么
uint_values_split_by_comma:
UINT {
pas::ic_label label = ctx->tab->new_label();
ctx->tab->add_label_
我正在写我自己的语言,我几乎完成了野牛的规则。现在剩下的是实施右侧。大约有650行。这种语言没有C复杂,但仍然相当复杂。我没有尝试过实现这些规则,除了一个测试应用程序来学习它。我有很多缺点,但我掌握了窍门
每个规则都是一个函数调用,因此其中可能有600行是函数调用,因此可能有500多个函数。当您尝试它时,功能在哪里相当简单?这些规则或所有其他代码的大部分工作是否不在调用的函数中?这项工作是在两者之间进行的吗?编写规则很容易。
我想您正在实现一个解释器。
据你所说,似乎你已经定义了600多条规则,
我一直试图让一个简单的计算器在野牛工作,但我得到了一个减少问题
你能告诉我我做错了什么吗
%{
#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
这是学校的作业。我只是在寻找一个正确的方向。也许当我看到答案时,我只是没有认出它(谷歌搜索)
我不想解析语法并立即执行{action},而是希望将所有内容都推送到数据结构中,以便以后执行。例如:如果cond stmt ELSE stmt,当正常解析时,两个stmt都会执行。我想如果我能把它放在某个地方,我就能控制发生的事情
我偏离基准了吗?完全正确
创建数据结构的常用方法是通过将$$(即产品的语义值)设置为根在该节点上的子树来构建它(作为一种树)
例如:
%{
typedef
struct
我有这些语法:
input : INPUT identifier SEMICOLON { gen(IN, $2, VOID, VOID); }
;
identifier : IDENTIFIER identifier_cont {
installed($1, 2);
$$ = $1;
假设我有以下两条规则:
rule1: names INTEGER {*do something1*}
names: ID
| names ID {*do something2*}
如何在do something2操作中包含整数信息?
在这个特定的示例中,我想在每个ID(从名称)旁边打印信息整数。您不能在该方向传递信息。当执行*dosomething2*时,即读取每个名称后,解析器甚至还没有看到整数。整数位于输入中的名称之后,输入从头到尾都是线性读取的-前面没有
标签: Bison
flex-lexeryacclex
我正在用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做一个解析器。在分析测试用例时,Bison给出了一个语法错误,表示它需要$end,但有更多的令牌。我在野牛手册中搜索了$end,但它似乎没有指出在什么条件下它会期望得到该标记。我使用了这种形式的递归规则
%start program
%%
program
: rule
| program rule;
定义我的语法根。Bison很高兴地匹配了规则的前三次调用,但抛出了第四次调用,说它期望$end。我如何向Bison表明它应该期望并匹配更多的令牌?听起来您的问题似
我正在为资产交换格式构建一个解析器。我在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 页