我的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
我有一个,但有一点不同。我想分析下面的模式:
ID = STRING
注意字符串没有引号。ID和字符串之间的区别是ID只能以字符和下划线开头,字符串没有这样的约束。区分标识符和字符串、flex或bison的最佳位置在哪里?在flex中,如果输入匹配两种模式,则首选第一种模式。因此,您可以编写,例如:
[[:alpha:]]_[[:alnum:]_]+ { yylval = strdup(yytext); return ID; }
[[:alnum:]_]+ {
嘿,伙计们,我想问问在bison中实现了一种语言的人
完成所有规则后,实现代码端需要多长时间?我不知道我是否应该做这件事。目前我在600 LoC(计算%%的中间部分)
实现代码需要多长时间?我知道这会有所不同,但你花了多长时间来实施
需要几天吗?月?还是数月/数年?
如果是两个星期或更少,我可以去做。如果超过2个月,我就不会考虑它(至少在这一点上)。
只是要求估算一下。我还需要考虑备份代码。把语言转换成C++或C语言应该是微不足道的。不管怎样,我希望得到一个粗略的估计。如果我知道你的代码是什么样
我对编写自定义语言有点陌生。在开始研究Flex、基于Bison的词法分析器、解析器和编译器之前,我想问一下,在我开始研究之前,是否有可能做到这一点,也许在工作一周后,我会意识到这是不可能的。我的目标是创建一种简单的脚本语言,这种语言将被翻译成C语言,在机器代码进入嵌入式平台之前,不需要进一步编译,因为这些代码需要以不同于普通语言的方式编译。我的观点是这样的:编写脚本->解析器根据规则将代码翻译成C代码->编译成嵌入式机器代码
所以也许有人可以建议我怎么做。目前,我正在阅读有关编译成机器代码的基于
我目前减少了bison,这意味着要将逗号分隔的列表与几个可选的不同规则相匹配:
如果不清楚,这意味着实现(伪代码):
实现这一点的方法是实施,例如:
optional_assignment_list:
:
| ',' assignment_list
;
然而,后一个公式不是LALR(1),因为在Bison看到逗号的每个步骤中,它必须决定是移动并查找*赋值列表*还是减少空*可选赋值列表*并继续查找*可选变量*
我试图找出是否有更好的方式来表达这一点。我已经能够通过引入*o
我有以下野牛档案-
%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
lexflex-lexerparser-generator
我有一些令人困惑的问题,让我陷入了一个循环,请帮助我理解它们
如果我有两个文件,一个是.y,它是解析器文件,第二个是.l词法分析器
我可以在解析器文件中使用yytext吗?我应该在那里定义yylex来使用它吗
如果我想更改它,有一个默认的yyerror函数。我应该在声明部分的解析器文件中声明它吗
如果在lex文件中,我向解析器返回一个令牌,如下所示:
[0-9]返回数字;
传递给解析器的是找到数字的数字,还是没有数字的数字本身
我如何在解析器文件中使用yylineno,因为我需要解析器使用yyl
标签: Bison
reduce-reduce-conflict
我写了以下语法:
没有。我认为优先级和关联属性定义得很好。有人能告诉我如何解决冲突吗
现在,bison发现了8个reduce/reduce冲突。当我删除行时
| '-' E %prec UMINUS {$$=-$2;}
没有。我认为优先级和关联属性定义得很好。有人能告诉我如何解决冲突吗
这应该可以解决问题:
%union{
string *s;
float num;
}
%token div_token mod_token sqrt_token it_token ab
我正在研究一个带有可重入选项的bison+flex解析器。解析器在调用yylex_init(&scanner)的函数中启动,其中scanner是yyscan_t%locations已打开
此解析器用于解析在其他文件中间找到的嵌入脚本。因此,行号不是从1开始的
但是,在可重入解析器中,当前行号隐藏在不透明的yyscan\t中,我没有看到一种干净的设置方法。我希望我遗漏了什么。您可以使用yyset\u lineno(int line\u number,yyscan\u t scanner)设置当前行
我有以下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时,#include“Driver.H”在定义yy::parser之前的Test.tab.hh中结束。这太快了,因为我想从Driver.H中使用yy::parser::token_type等等
如果我的#include出现在%union声明之后,它会根据需要在Test.tab.cc中结束。但是如果我想使用YYSTYPE而不是%union,该怎么办?什么确切地确定了%{块是否在头文件或解析器源文件中结束?如中所述,序言(%{块)的位置取决于它是在%union声明之前
我的大语法有两条规则:
indexed_component
: name '(' val_list ')'
;
val_list
: val
| val_list ',' val
;
如何在val_列表中访问“name”的值
我知道我可以使用全局变量,但这是高度递归的,因此我必须使用堆栈,我希望避免麻烦。在您的情况下,您可以在bison文档中使用所谓的中间规则操作。下面是它可能的样子:
{%
std::string compone
我正试图使用flex和bison创建一个过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用flex+bison来识别语法,并转储感兴趣元素的位置。(然后使用脚本根据转储的位置抓取文本。)
我发现flex可以支持一个名为bison locations的bison特性,但它在实际应用中是如何工作的。我在flex文档中尝试了这个例子,似乎yylloc不是由flex自动设置的,我总是得到(1,0)-(1,0)。flex能否自动计算每个令牌的位置?如果没有,定义了什么接口函数供我实现?有什么例
我正在用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
我希望为一种现有语言创建一个JavaScript解析器,该语言目前拥有笨拙的“手工”C#和Java解析器。我想使用吉森,并且一直在努力学习野牛的基础知识
我不确定如何回答的一个问题是,野牛/吉森的产出究竟是多少?我是否自动获取任何内容(如AST)?或者所有的事情都是由编写bison文件的人使用规则操作完成的。例如,如果我有一个规则,指定了一个新的变量赋值,符合该规则:
可变语句
:VAR VariableDeclarationList';'
我是否必须在Jison生成的javascript文件中
Lex和Yacc可以一起解析Lex和Yacc吗
换句话说,是否有可能编写一个Lex/Yacc组合,它是自托管的,生成它们自己的解析器
编辑:我不是说组合需要完全解析输入的C部分。特别是,它不需要处理typedef名称/标识符冲突,也不需要构建一个完整的符号表(尽管我相信这两者都可以在lexer和parser中用C代码处理)。这是因为C代码被逐字复制到输出中
编辑2:基本上,Lex和Yacc(语言,而不是程序)有LALR(1)语法吗?是的,他们有。lex的flex实现是自举的。如果我没记错的话,y
标签: Bison
flex-lexeriproute
我听说了。Bison从output Flex获取输入。默认情况下,Flex从stdin获取输入。ss在哪里设置来自命令行参数的flex输入?Bison在需要令牌时调用yylex。yylex的返回值是一个小整数,它要么是bison语法中用%token声明的枚举常量之一,要么是除0以外的字符常量,要么是表示EOF的0
yylex还必须:
如果令牌具有语义值,则将令牌的语义值保存在全局变量yylval中;及
如果解析器操作使用位置信息,则将令牌在输入流中的位置保存在全局变量yylloc中
可以使用fl
我需要使用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
yacclexflex-lexer
我正在构建一个词法和语法分析器。当我尝试在.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;}
{
我正在考虑使用在Github上找到的一些BNF文件制作一个基于Bison的解析器。然而,我的问题是,我似乎无法确定文件使用的BNF是什么变体
到包含BNF变体样本的文件夹
在中,作者引用了,但他的文件与之完全不同:
## The following comes from: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
<syntax> : <rule> | <rule> <syntax>
我试图在62位(fedora)上编译HLA,结果出现以下错误:
flex:输入规则太复杂(>=32000个NFA状态)
我在下面的URL找到了地址:
在flexdef.h中增加以下定义:
#定义阻塞状态-32766/*标记对始终阻塞的状态的引用*/
#定义最大值\u MNS 31999
#定义错误的下标-32767
重新编译所有内容,它应该都能工作
我下载了flex SRPM,进行了上述更改,编译并安装了它,但它不起作用!:(谢谢@EJP和@Wayne Sudo
我刚刚在以下位置找到了解决方案
我正在学习lex/bison/yacc等,我正在一个名为
这是通过一个关于UDemy的教程实现的
我刚刚开始尝试让它为2+2生成AST。这看起来应该很简单,但我不知道我写的代码有什么问题
它正在为数字生成AST,但不为二进制表达式生成AST
%lex
%%
\s+ /* skip whitespace */
\d+ return 'NUMBER'
[\+\-] return 'ADDITIVE_OPERATION'
[\*\/] return '
在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... }
但野牛抱怨默认操作
我正在尝试分析以下语法:
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;
%%
我从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_
我在野牛规格中有以下产品:
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
我正在使用野牛和我的CFG有一个移位减少冲突,这是搞砸了我的优先权
这是我的代码:
Decl : vartype T_Identifier T_Semicolon {
// replace it with your implementation
Identifier *id = new Identifier
Bison公开暴露于yyparse函数。有没有办法阻止它那样做?我想公开我自己的包装器,通过它初始化一些变量。Bison肯定会生成入口点yyparse,除非您使用%name prefix或%define api.prefix指定不同的全局符号前缀。如果你改变前缀,很多符号的名称,包括yytext和yyleng,都会改变,这会给你带来不便
但是,除了这个符号存在并因此可以被称为之外,它似乎并不十分令人讨厌。如果您想用不同的函数包装解析器,您可以这样做,并在代码中使用该函数的名称。bison生成的代
我正在用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文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include "calc.tab.h"
%}
digit ([0-9])
characters ([a-z])
smallcasedigit ([a-z0-9])
identifier
我不擅长编写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中终止操作但仍继续解析的关键字是什么?
假设我有这样的语法:
规则:某物{如果(某物)终止动作;代码}某物{}
它应该只是退出当前操作并继续,是不是只是返回?没有这样的关键字,所以最好的办法是只反转条件:
nonterm: pattern { if (!condition) {
/* Do what needs to be done */
}
}
Do不从语义操作返
目前,我正在开发一个源代码到源代码的编译器,并且已经编写了一个bison解析器,可以正确地为输入创建AST。我现在需要在语法树上做几个转换,因此我需要在树中插入许多节点
我可以手动创建要添加到语法树中的所有结构/联合,但这似乎需要做很多工作
对我来说,创建一个字符串要容易得多,我希望这个字符串能被我已有的解析器解析。然后解析器应该返回这个字符串的树,我可以将它插入到我的原始语法树中
不幸的是,无法使用解析器的start规则解析字符串,因为它必须由子规则解析(例如,我的解析器解析包含语句的函数列表
我有以下Bison语法片段:
binary_op: BINARY_OP
{
...
}
| '|' %prec BINARY_OP
{
...
}
;
non_keyword_expr:
我正在研究一个可重入的Bison解析器。为了关注这个问题,我已经,我已经从我的解析器中划出了最小的代码,并对其进行了修改,使其成为一个工作示例。这是:
%code top {
typedef void* yyscan_t;
typedef struct {
char tmpString1[1000];
} parseSupportStructType;
}
%define api.pure full
%lo
我想做一个简单的计算器,计算值为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 {
我在试着写一门小语言。但我的语法错误中有移位减少冲突。我怎样才能解决这个问题?这是我的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文件无法编译,我想知道为什么它无法编译(无可否认,我有一些shift/reduce和reduce/reduce错误。但这不应该阻止它吗?)
是否有人链接到它的实际功能或它为什么不编译我的代码
-y, --yacc
emulate POSIX Yacc
默认情况下,Bison生成一组文件名,但POSIX需要另一组文件名。-y标志使Bison生成POSIX名称,而不是它自己的名称集
对于输入文件名gr
标签: Bison
yacclexflex-lexer
我正在写一个Flex/Bison Lexer/Parser来解析我自己设计的脚本,作为大学的一项作业。它运行得很好,我的脚本解析正确,检测到任何错误等,都能识别标记并传递语义
然而,我有点不确定如何将其转化为有用的信息。。。我只需要输出简单的文本,这本身就足够简单,但是我正在努力解决在yacc中在何处这样做的逻辑问题
例如,假设我的yacc是这样的-
statement :
DRAW shape AT location { printf("Draw shape at location"
我是一个刚接触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:
这是我的y文件的一个示例
| rval '<' rval
| rval '<' '<' rval
| rval '>' rval
| rval '>' '>' rval
| rval LSHIFT rval
| rval RSHIFT rval
| rval“”rval
|右移
|右移
我想让像>一样工作。我原以为这很难,但却发现“上下文相关优先权”
然而,它似乎不起作用。书写
|在lexer中使用rval'\s*>,因为这会干扰其他事情,所以在解析器
我有一个使用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
shift-reduce-conflict
我试图描述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
... 不要过度思考这个问题。其实一切都很简单,没有魔法%union非常神奇,它所做的就是根据%type或%token声明中声明的“类型”(实际上是一个标记),在堆栈引用之后插入一个union成员标记。感谢您的输入。另一个问题。假设一个数字生成被定义为数字:“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”| 9”。在这种情况下,如果不使用if(isidgit(c)),我将如何提取语义值?有可能吗?@flashburn:在yacc/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 <
我目前正在用C、Bison和Flex开发自己的shell
我刚开始学习,但我找不到摆脱语法的方法来让它起作用
我的问题在于argList语法(我想)。arg argList{$1->next=$2;$$=$1;}
用于允许我以后将多个参数传递到列表中
没有它,编译后的解析器就可以按预期工作:它允许我输入MOS令牌并执行该函数,之后允许我继续使用不同(但仅限于一个)参数输入MOS令牌
有了这段语法,解析器允许我输入MOS标记,但只在我按Ctrl+D组合键离开它时才执行该函数。为什么?
谢谢你的回答
我正在使用Bison生成一个解析器。我有一个转变/减少冲突,我真的需要野牛使用GLR而不是LALR来处理它。但是我已经传递了%glr parser指令,并且源文件仍然声明它是一个LALR解析器。我甚至发现了一个“GLR.CC”骨架,它是GLR C++分析器,它使用了代码> %Frase[GLR.CC ] < /C> >没有改变输出。Bison不是为所有目标语言提供所有算法吗?您只需要%glr parser就可以获得一个glr解析器。请注意,GLR解析器可能仍然存在冲突(shift/reduce或
标签: Bison
yacccontext-free-grammarflex-lexer
我试图为bison中的x格式(实际上是blender python脚本导出的子集的子集)提供语法。但是我得到了一个shift-reduce冲突,bison不会告诉我在哪里,或者“某种程度上”告诉我在哪里,这取决于我的尝试
首先,这里是blender中的一个示例.x文件,我正在测试它:
xof 0303txt 0032
Frame Root {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000,
0
对于以下语法,我遇到了SR错误
这是我的语法
program : CLASS Program '{' field_decl '}'
;
field_decl : type field_part ';'
| field_part field_fact
| meth_decl
|
;
field_fact : ',' field_decl
| field_pa
标签: Bison
flex-lexertext-parsingfileparsing
我需要使用flex和Bison解析以下文件:
新文件
BEGIN BLOCK BLK_ROWDEC
NAME cell_rowdec
SIZE UNI_rowdecSize
ITERATE itr_rows
DIR
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 15 页