类C语言的Bison移位/减少错误

我的bison语法有问题,它给了我移位/减少错误,我已经为操作符定义了优先级 我知道这是由expr规则中的“expr binop expr”位引起的。这是我的bison文件和我得到的输出。任何帮助都将不胜感激 %token ID KEYWORD INTCON FLOATCON TYPE STRING %token IF WHILE FOR VOID RETURN %token AND_OP OR_OP EQ_OP NEQ_OP LEQ_OP GEQ_OP %left OR_OP %left A

Bison 如何区分标识符和字符串?

我有一个,但有一点不同。我想分析下面的模式: ID = STRING 注意字符串没有引号。ID和字符串之间的区别是ID只能以字符和下划线开头,字符串没有这样的约束。区分标识符和字符串、flex或bison的最佳位置在哪里?在flex中,如果输入匹配两种模式,则首选第一种模式。因此,您可以编写,例如: [[:alpha:]]_[[:alnum:]_]+ { yylval = strdup(yytext); return ID; } [[:alnum:]_]+ {

Bison:在规则之后实现代码

嘿,伙计们,我想问问在bison中实现了一种语言的人 完成所有规则后,实现代码端需要多长时间?我不知道我是否应该做这件事。目前我在600 LoC(计算%%的中间部分) 实现代码需要多长时间?我知道这会有所不同,但你花了多长时间来实施 需要几天吗?月?还是数月/数年? 如果是两个星期或更少,我可以去做。如果超过2个月,我就不会考虑它(至少在这一点上)。 只是要求估算一下。我还需要考虑备份代码。把语言转换成C++或C语言应该是微不足道的。不管怎样,我希望得到一个粗略的估计。如果我知道你的代码是什么样

Bison 自定义脚本语言

我对编写自定义语言有点陌生。在开始研究Flex、基于Bison的词法分析器、解析器和编译器之前,我想问一下,在我开始研究之前,是否有可能做到这一点,也许在工作一周后,我会意识到这是不可能的。我的目标是创建一种简单的脚本语言,这种语言将被翻译成C语言,在机器代码进入嵌入式平台之前,不需要进一步编译,因为这些代码需要以不同于普通语言的方式编译。我的观点是这样的:编写脚本->解析器根据规则将代码翻译成C代码->编译成嵌入式机器代码 所以也许有人可以建议我怎么做。目前,我正在阅读有关编译成机器代码的基于

Bison 是否有一种方法可以在保持LALR(1)的情况下减少此减少中的替代品数量?

我目前减少了bison,这意味着要将逗号分隔的列表与几个可选的不同规则相匹配: 如果不清楚,这意味着实现(伪代码): 实现这一点的方法是实施,例如: optional_assignment_list: : | ',' assignment_list ; 然而,后一个公式不是LALR(1),因为在Bison看到逗号的每个步骤中,它必须决定是移动并查找*赋值列表*还是减少空*可选赋值列表*并继续查找*可选变量* 我试图找出是否有更好的方式来表达这一点。我已经能够通过引入*o

Bison语句结构中的OR条件

我有以下野牛档案- %union { int integer_value; double double_value; char* string_value; } %token <integer_value> INTEGER %token <string_value> VAR %token <string_value> INTEGER_DECLARATION %token <double_value> DOUBLE %tok

Bison 野牛解析器基本问题

我有一些令人困惑的问题,让我陷入了一个循环,请帮助我理解它们 如果我有两个文件,一个是.y,它是解析器文件,第二个是.l词法分析器 我可以在解析器文件中使用yytext吗?我应该在那里定义yylex来使用它吗 如果我想更改它,有一个默认的yyerror函数。我应该在声明部分的解析器文件中声明它吗 如果在lex文件中,我向解析器返回一个令牌,如下所示: [0-9]返回数字; 传递给解析器的是找到数字的数字,还是没有数字的数字本身 我如何在解析器文件中使用yylineno,因为我需要解析器使用yyl

Bison 野牛减少/减少冲突

我写了以下语法: 没有。我认为优先级和关联属性定义得很好。有人能告诉我如何解决冲突吗 现在,bison发现了8个reduce/reduce冲突。当我删除行时 | '-' E %prec UMINUS {$$=-$2;} 没有。我认为优先级和关联属性定义得很好。有人能告诉我如何解决冲突吗 这应该可以解决问题: %union{ string *s; float num; } %token div_token mod_token sqrt_token it_token ab

起始行#不是1的bison可重入解析器

我正在研究一个带有可重入选项的bison+flex解析器。解析器在调用yylex_init(&scanner)的函数中启动,其中scanner是yyscan_t%locations已打开 此解析器用于解析在其他文件中间找到的嵌入脚本。因此,行号不是从1开始的 但是,在可重入解析器中,当前行号隐藏在不透明的yyscan\t中,我没有看到一种干净的设置方法。我希望我遗漏了什么。您可以使用yyset\u lineno(int line\u number,yyscan\u t scanner)设置当前行

Flex/Bison';yylex';:函数不接受3个参数

我有以下Lexer.l和Parser.y文件 莱克瑟 %{ #include "Parser.h" %} %option yylineno %option outfile="Lexer.cpp" header-file="Lexer.h" %option warn nodefault %option reentrant noyywrap never-interactive nounistd %option bison-bridge

Bison 如何将代码放入MyFile.tab.cc? 我试图遵循“信息BISY”中C++示例的基本建议,所以我有一个驱动程序< /C>类和一个Test.yy文件: %skeleton "lalr1.cc" %{ class Driver; #include "Expression.hpp" #define YYSTYPE Expression %} %parse-param { Driver& driver } %lex-param { Driver& driver } %defines %locations %{ #include "Driver.H" %} %% input: {};

但是,当我对该文件进行bison时,#include“Driver.H”在定义yy::parser之前的Test.tab.hh中结束。这太快了,因为我想从Driver.H中使用yy::parser::token_type等等 如果我的#include出现在%union声明之后,它会根据需要在Test.tab.cc中结束。但是如果我想使用YYSTYPE而不是%union,该怎么办?什么确切地确定了%{块是否在头文件或解析器源文件中结束?如中所述,序言(%{块)的位置取决于它是在%union声明之前

Bison 野牛:如何在不使用全局变量的情况下访问以前的非终端的值?

我的大语法有两条规则: indexed_component : name '(' val_list ')' ; val_list : val | val_list ',' val ; 如何在val_列表中访问“name”的值 我知道我可以使用全局变量,但这是高度递归的,因此我必须使用堆栈,我希望避免麻烦。在您的情况下,您可以在bison文档中使用所谓的中间规则操作。下面是它可能的样子: {% std::string compone

Bison flex如何准确地支持野牛定位?

我正试图使用flex和bison创建一个过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用flex+bison来识别语法,并转储感兴趣元素的位置。(然后使用脚本根据转储的位置抓取文本。) 我发现flex可以支持一个名为bison locations的bison特性,但它在实际应用中是如何工作的。我在flex文档中尝试了这个例子,似乎yylloc不是由flex自动设置的,我总是得到(1,0)-(1,0)。flex能否自动计算每个令牌的位置?如果没有,定义了什么接口函数供我实现?有什么例

flex/bison解析器使用分段错误进行编译

我正在用flex/bison编写解析器(我可以用Python编写解析器,但我总是更喜欢经典的) 当我用以下代码编译代码时: gcc -lfl -ly chance.tab.c lex.yy.c -o chance 当我用一个文件运行程序时,我得到如下结果: Segmentation fault (core dumped) 以下文件供任何人参考: chance.y %{ #include <stdio.h> %} %union { char* str; } %t

Bison 了解野牛/吉森

我希望为一种现有语言创建一个JavaScript解析器,该语言目前拥有笨拙的“手工”C#和Java解析器。我想使用吉森,并且一直在努力学习野牛的基础知识 我不确定如何回答的一个问题是,野牛/吉森的产出究竟是多少?我是否自动获取任何内容(如AST)?或者所有的事情都是由编写bison文件的人使用规则操作完成的。例如,如果我有一个规则,指定了一个新的变量赋值,符合该规则: 可变语句 :VAR VariableDeclarationList';' 我是否必须在Jison生成的javascript文件中

Bison Lex和Yacc-Lex可以解析自己吗?

Lex和Yacc可以一起解析Lex和Yacc吗 换句话说,是否有可能编写一个Lex/Yacc组合,它是自托管的,生成它们自己的解析器 编辑:我不是说组合需要完全解析输入的C部分。特别是,它不需要处理typedef名称/标识符冲突,也不需要构建一个完整的符号表(尽管我相信这两者都可以在lexer和parser中用C代码处理)。这是因为C代码被逐字复制到输出中 编辑2:基本上,Lex和Yacc(语言,而不是程序)有LALR(1)语法吗?是的,他们有。lex的flex实现是自举的。如果我没记错的话,y

Bison “ss”在哪里设置flex输入来自命令行参数?

我听说了。Bison从output Flex获取输入。默认情况下,Flex从stdin获取输入。ss在哪里设置来自命令行参数的flex输入?Bison在需要令牌时调用yylex。yylex的返回值是一个小整数,它要么是bison语法中用%token声明的枚举常量之一,要么是除0以外的字符常量,要么是表示EOF的0 yylex还必须: 如果令牌具有语义值,则将令牌的语义值保存在全局变量yylval中;及 如果解析器操作使用位置信息,则将令牌在输入流中的位置保存在全局变量yylloc中 可以使用fl

Bison 野牛:尝试使用字符*

我需要使用flex和bison来解析一些代码 YYSTYPE的默认类型是int,尽管我从未这样声明过。这是野牛的违约吗 把弦传回去对我有很大帮助。我读到:这看起来是一个很好的方法。(我还不需要工会的全部权力,只需要char*部分,但我也可以使用工会,因为它以后可能会有所帮助。) 这对我不起作用。我发现以下错误: y:111.37-38: $1 of `ConstExpression' has no declared type y:113.34-35: $1 of `ConstFactor' ha

Bison 获取:警告,无法匹配规则

我正在构建一个词法和语法分析器。当我尝试在.l文件中使用flex时,我收到以下警告 littleDuck.l:26: warning, rule cannot be matched 规则26以{cteI}开头,我的规则部分如下: [ \t\n] ; {RW} {return RESERVED;} {id} {return ID;} {ops} {return OPERATOR;} {seps} {return SEPARATOR;} {

Bison 这是什么BNF变体?

我正在考虑使用在Github上找到的一些BNF文件制作一个基于Bison的解析器。然而,我的问题是,我似乎无法确定文件使用的BNF是什么变体 到包含BNF变体样本的文件夹 在中,作者引用了,但他的文件与之完全不同: ## The following comes from: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form <syntax> : <rule> | <rule> <syntax>

Bison flex:输入规则太复杂(>;=32000个NFA状态)(在62位上编译HLA时)

我试图在62位(fedora)上编译HLA,结果出现以下错误: flex:输入规则太复杂(>=32000个NFA状态) 我在下面的URL找到了地址: 在flexdef.h中增加以下定义: #定义阻塞状态-32766/*标记对始终阻塞的状态的引用*/ #定义最大值\u MNS 31999 #定义错误的下标-32767 重新编译所有内容,它应该都能工作 我下载了flex SRPM,进行了上述更改,编译并安装了它,但它不起作用!:(谢谢@EJP和@Wayne Sudo 我刚刚在以下位置找到了解决方案

Bison 莱克斯/野牛园';t生成ast 2+;2.

我正在学习lex/bison/yacc等,我正在一个名为 这是通过一个关于UDemy的教程实现的 我刚刚开始尝试让它为2+2生成AST。这看起来应该很简单,但我不知道我写的代码有什么问题 它正在为数字生成AST,但不为二进制表达式生成AST %lex %% \s+ /* skip whitespace */ \d+ return 'NUMBER' [\+\-] return 'ADDITIVE_OPERATION' [\*\/] return '

在bison中匹配多个模式

在lex/flex中,可以使用普通的正则表达式规则将多个模式匹配到一个令牌,但是在yacc/bison端的等价物是什么 在我的代码中,对于单个任务,我有两个可能的语法: IF expression THEN number IF expression GOTO number 看起来很明显 | IF expression THEN number | IF expression GOTO number { ... guts of the handler go here... } 但野牛抱怨默认操作

这个Bison代码中的移位/减少冲突来自哪里?

我正在尝试分析以下语法: 34 + 1 − 8, 32 * 87 + 6 / 4, 34 / 8 我希望它像这样接地: (, (- (+ 34 1) 8) (/ (+ (* 32 87) 6) 4) (/ 34 8)) 这是野牛的代码: %token NUMBER %token COMMA %token OPERATOR %left OPERATOR %left COMMA %% term: NUMBER | term op term ; op: OPERATOR | COMMA; %%

Bison win_flex.exe:致命的内部错误,fopen(headerfilename)失败

我从sourceforge下载了最新的win_flex。 运行时出现以下错误: win_flex.exe:致命的内部错误,fopen(headerfilename)失败 使用以下命令行: windows\u cmd>win\u flex.exe-ogramer.cpp hello.l 我使用的是64位Windows 有人能帮我解决这个问题吗?这是UAC权限问题吗?我尝试重新编程,并执行以下操作: 从下载的win_flex 在我的C:\Users\me\Downloads文件夹中解压 运行win_

为什么yacc/bison中的$1的值为0

我在野牛规格中有以下产品: op : '+' { printf("%d %d %c\n", $1, '+', '+'); } 当我输入+时,我得到以下输出: 0 43 + 有人能解释一下为什么$1的值是0,是不是应该是43?我错过了什么 编辑 没有flex文件,但我可以提供bison语法: %{ #include <stdio.h> #include <ctype.h> #include <string.h> int yylex(); int yyerr

Bison 野牛转移减少冲突

我正在使用野牛和我的CFG有一个移位减少冲突,这是搞砸了我的优先权 这是我的代码: Decl : vartype T_Identifier T_Semicolon { // replace it with your implementation Identifier *id = new Identifier

如何在bison中取消yyparse()的定义?

Bison公开暴露于yyparse函数。有没有办法阻止它那样做?我想公开我自己的包装器,通过它初始化一些变量。Bison肯定会生成入口点yyparse,除非您使用%name prefix或%define api.prefix指定不同的全局符号前缀。如果你改变前缀,很多符号的名称,包括yytext和yyleng,都会改变,这会给你带来不便 但是,除了这个符号存在并因此可以被称为之外,它似乎并不十分令人讨厌。如果您想用不同的函数包装解析器,您可以这样做,并在代码中使用该函数的名称。bison生成的代

Bison 如何根据生产情况更改令牌的类型';s型?

我正在用Lex和Yacc开发一个小项目,我必须处理数学表达式 在我的文件syntax.y中,我有以下两种类型的产生式规则: %union { char* lexeme; double value; } %token <lexeme> NUM %type <lexeme> expr %type <value> comp_expr expr : expr "+" expr { $$ = strcat($1,"+")

使用flex和bison的计算器

我是flex和bison的新手,我正在尝试使用flex和bison制作一个计算器。我的flex正在编译,但我的bison文件中出现了错误 下面是我的flex文件: %{ #include <stdio.h> #include <stdlib.h> #include "calc.tab.h" %} digit ([0-9]) characters ([a-z]) smallcasedigit ([a-z0-9]) identifier

Bison 词汇和语法分析器

我不擅长编写flex和bison程序。我试图制作一个简单的词汇和语法分析器。当我试图编译它们时,我有一个错误列表。 我应该如何声明标识符 Lexical.l.10: error: 'idf' undeclared <first use in this fucntion> Lexical.l.11: error: 'cst' undeclared <first use in this fucntion> Lexical.l.12: error: 'aff' undeclar

Bison 终止野牛行动

在Bison中终止操作但仍继续解析的关键字是什么? 假设我有这样的语法: 规则:某物{如果(某物)终止动作;代码}某物{} 它应该只是退出当前操作并继续,是不是只是返回?没有这样的关键字,所以最好的办法是只反转条件: nonterm: pattern { if (!condition) { /* Do what needs to be done */ } } Do不从语义操作返

使bison开始解析时使用的规则不是start规则

目前,我正在开发一个源代码到源代码的编译器,并且已经编写了一个bison解析器,可以正确地为输入创建AST。我现在需要在语法树上做几个转换,因此我需要在树中插入许多节点 我可以手动创建要添加到语法树中的所有结构/联合,但这似乎需要做很多工作 对我来说,创建一个字符串要容易得多,我希望这个字符串能被我已有的解析器解析。然后解析器应该返回这个字符串的树,我可以将它插入到我的原始语法树中 不幸的是,无法使用解析器的start规则解析字符串,因为它必须由子规则解析(例如,我的解析器解析包含语句的函数列表

可重入Bison解析器的参数未正确反映为yyerror的参数

我正在研究一个可重入的Bison解析器。为了关注这个问题,我已经,我已经从我的解析器中划出了最小的代码,并对其进行了修改,使其成为一个工作示例。这是: %code top { typedef void* yyscan_t; typedef struct { char tmpString1[1000]; } parseSupportStructType; } %define api.pure full %lo

flex和bison不识别字符

我想做一个简单的计算器,计算值为3+4或5/8,但我有一个abs使用数学函数的问题。我的代码如下: 野牛锉 %{ #include <stdio.h> #include <math.h> %} /* declare tokens */ %token NUMBER %token ADD SUB MUL DIV ABS %token EOL %% calclist: /* nothing */ | calclist exp EOL {

Bison 野牛:减少我语法中的冲突

我在试着写一门小语言。但我的语法错误中有移位减少冲突。我怎样才能解决这个问题?这是我的yacc文件: %{ void yyerror(char *s); int yylex(); #include <stdio.h> #include <stdlib.h> #include <cterm.h> int symbols[52]; int symbolVal(char symbol); void updateSymbolVal(char symbo

Bison 在野牛中-y/-yacc标志做什么?

我搜索了手册页,找到了这个。但是这是什么意思?如果没有它,我的bison文件无法编译,我想知道为什么它无法编译(无可否认,我有一些shift/reduce和reduce/reduce错误。但这不应该阻止它吗?) 是否有人链接到它的实际功能或它为什么不编译我的代码 -y, --yacc emulate POSIX Yacc 默认情况下,Bison生成一组文件名,但POSIX需要另一组文件名。-y标志使Bison生成POSIX名称,而不是它自己的名称集 对于输入文件名gr

Bison I';我不知道如何输出(复杂)有用的信息时,在我的野牛解析器

我正在写一个Flex/Bison Lexer/Parser来解析我自己设计的脚本,作为大学的一项作业。它运行得很好,我的脚本解析正确,检测到任何错误等,都能识别标记并传递语义 然而,我有点不确定如何将其转化为有用的信息。。。我只需要输出简单的文本,这本身就足够简单,但是我正在努力解决在yacc中在何处这样做的逻辑问题 例如,假设我的yacc是这样的- statement : DRAW shape AT location { printf("Draw shape at location"

为bison和flex编写问题

我是一个刚接触flex和bison的新手,我有一个小问题。一旦我得到了我的lex.yy.c文件和我的tab.c文件,当我编译lex.yy.c文件时,我得到了错误: stojk_2.l: In function ‘int yylex()’: stojk_2.l:3: error: ‘PLUS’ was not declared in this scope stojk_2.l:4: error: ‘MINUS’ was not declared in this scope stojk_2.l:5:

Bison %prec不';好像不行?

这是我的y文件的一个示例 | rval '<' rval | rval '<' '<' rval | rval '>' rval | rval '>' '>' rval | rval LSHIFT rval | rval RSHIFT rval | rval“”rval |右移 |右移 我想让像>一样工作。我原以为这很难,但却发现“上下文相关优先权” 然而,它似乎不起作用。书写 |在lexer中使用rval'\s*>,因为这会干扰其他事情,所以在解析器

flex/bison未终止于<&书信电报;EOF>&燃气轮机;

我有一个使用flex/bison的简单项目。我试图解析一个文本文件,但它并没有停止解析(显然是文件末尾的一个循环) 我的flex代码: %{ #include "y.tab.h" %} %% [0-9] { printf("digit: %s\n",yytext); return DIGIT; } [a-zA-ZáéíóúÁÉÍÓÚçÇãõÃÕ]+ { printf("word: %s\n",yytext); return WORD

Bison 野牛转移/减少冲突

我试图描述Bison输入文件的以下语法: 这是我的意见: %start Program %token KW_CLASS KW_EXTENDS KW_PUBLIC KW_STATIC KW_BOOLEAN KW_STRING KW_FLOAT KW_INT EOF %token KW_IF KW_WHILE KW_BREAK KW_CONTINUE KW_SWITCH KW_CASE KW_DEFAULT KW_RETURN %token KW_NEW KW_THIS KW_NULL KW_TR

Bison ... 不要过度思考这个问题。其实一切都很简单,没有魔法%union非常神奇,它所做的就是根据%type或%token声明中声明的“类型”(实际上是一个标记),在堆栈引用之后插入一个union成员标记。感谢您的输入。另一个问题。假设一个数字生成被定义为数字

... 不要过度思考这个问题。其实一切都很简单,没有魔法%union非常神奇,它所做的就是根据%type或%token声明中声明的“类型”(实际上是一个标记),在堆栈引用之后插入一个union成员标记。感谢您的输入。另一个问题。假设一个数字生成被定义为数字:“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”| 9”。在这种情况下,如果不使用if(isidgit(c)),我将如何提取语义值?有可能吗?@flashburn:在yacc/bison中,你不能将一个动作附加到多个产品

flex/bison制造的计算器

我试图制作一个使用括号的抽象语法树计算器。 这是工作,但我有问题输出一个公式 这是我的解析器 parser.y /* declarations */ %{ #include <stdio.h> #include "ast.h" int yylex(); void yyerror(char *); %} %union { struct ast *node; int value; }%token ADD SUB MUL DIV LPA RPA EOL %token <

Bison 语法不是终端?

我目前正在用C、Bison和Flex开发自己的shell 我刚开始学习,但我找不到摆脱语法的方法来让它起作用 我的问题在于argList语法(我想)。arg argList{$1->next=$2;$$=$1;} 用于允许我以后将多个参数传递到列表中 没有它,编译后的解析器就可以按预期工作:它允许我输入MOS令牌并执行该函数,之后允许我继续使用不同(但仅限于一个)参数输入MOS令牌 有了这段语法,解析器允许我输入MOS标记,但只在我按Ctrl+D组合键离开它时才执行该函数。为什么? 谢谢你的回答

C++;带Bison的GLR解析器

我正在使用Bison生成一个解析器。我有一个转变/减少冲突,我真的需要野牛使用GLR而不是LALR来处理它。但是我已经传递了%glr parser指令,并且源文件仍然声明它是一个LALR解析器。我甚至发现了一个“GLR.CC”骨架,它是GLR C++分析器,它使用了代码> %Frase[GLR.CC ] < /C> >没有改变输出。Bison不是为所有目标语言提供所有算法吗?您只需要%glr parser就可以获得一个glr解析器。请注意,GLR解析器可能仍然存在冲突(shift/reduce或

shift/reduce conflict尝试使用bison为DirectX格式的子集生成语法

我试图为bison中的x格式(实际上是blender python脚本导出的子集的子集)提供语法。但是我得到了一个shift-reduce冲突,bison不会告诉我在哪里,或者“某种程度上”告诉我在哪里,这取决于我的尝试 首先,这里是blender中的一个示例.x文件,我正在测试它: xof 0303txt 0032 Frame Root { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0

Bison yacc转移/减少冲突

对于以下语法,我遇到了SR错误 这是我的语法 program : CLASS Program '{' field_decl '}' ; field_decl : type field_part ';' | field_part field_fact | meth_decl | ; field_fact : ',' field_decl | field_pa

使用flex和bison解析文件

我需要使用flex和Bison解析以下文件: 新文件 BEGIN BLOCK BLK_ROWDEC NAME cell_rowdec SIZE UNI_rowdecSize ITERATE itr_rows DIR

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