我正在使用flex/bison开发编译器。
我的生成输出中有此警告
警告:在默认操作中键入clash('s')
有什么帮助吗?它似乎与源代码中的%token和%type声明有关。
如果没有源代码行以及相关的标记和类型声明,就很难为您提供帮助
如果指定val类型的expr并定义tptr类型的ID标记
%{
#include "parser.h"
%}
%type <val> expr
%token <tptr> ID
请注意,在本例中,我当前使用的野牛级别打印的消息略有不
标签: Bison
flex-lexershift-reduce-conflictambiguous-grammar
我有一个用语法描述的文件。它有一个部分可以由一种或两种内容组成,并且可以按任意顺序排列:
...
type_a_thing
type_b_thing
type_b_thing
type_a_thing
....
或者只是
...
type_a_thing
...
或
或任何组合,在任何数量的事件中。类型a和类型b都有一个定义良好的结构。我已经设法描述了这一点,以便解析器能够工作,但我仍然得到了shift/reduce错误。
我在这里上传了一个简单的例子:
这是解决这个问题的正确方法吗?我做
对不起,我是野牛队的新手。我不明白这个问题以及如何解决它。如果您能“教我如何钓鱼”,同时指出问题和解决方案,我将不胜感激:
%left '.' '+'
%right '(' '['
%%
OptionalExpressions
: { $$ = nullptr; }
| Expressions
;
Expressions
: Expression
| Expressions ',' Expression
;
Expression
: Expression '+
我正在努力学习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
我试图在客户端和服务器之间建立一个消息的请求-响应序列。
为了解析消息,我使用了flex和bison语法。
我有一个关于在不同语法中重用规则的问题。
例如,如果我有一个语法来处理请求
req_message:
request_message
|response_message
|error
;
请求消息在哪里
request_message:
|request_header_list request_hdr
请求_hdr是
request_hdr:
标签: 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
|
标签: Bison
lexcontext-free-grammarbisonc++
有人知道这句话:
$default reduce using rule 1 (P)
谁是$default。。。
它应该是一个特定的终端,但是是哪一个呢?默认操作适用于未使用另一个操作指定的每个终端。因此。。。我想编译一个表,看起来像龙书中的表,我要把reduce操作放在哪里?谁是州号码,谁是对应的代币?非常感谢@弗朗西丝科兰扎摆好了桌子。填写所有指定端子的操作。然后在空框中填入默认操作。谢谢=D确定。。我现在才明白你的意思;)@蓖麻
首先,我必须明确我是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>
我的程序有一个奇怪的错误
我的YYSTYPE的结构是
%union
{
char *text;
node *n;
}
%token <text> NUMBER
我是否遗漏了一些明显的信息?当您执行以下操作时:
$<n>$->left = $<n>$->right = NULL;
$$->left=$$->right=NULL;
您认为$$的值是多少?您是否已将其分配给节点对象的地址
为了节省时间:您没有分配它,
野牛
%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编写解析器。我遇到了一个问题,bison检测到了解析错误,但没有调用yyerror
下面是我处理类定义的脚本片段:
%{ ...
void yyerror(char *s);
Program ast_root; /* the result of the parse */
Classes parse_results;
}%
...
%%
/*
Save the
标签: 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
标签: Bison
yacclexflex-lexerlexer
我目前正在尝试使用Flex+Bison编写一个小型编译器,但我对如何处理错误,特别是如何使所有内容都协调一致,有点不知所措。为了激发讨论,请考虑下面我使用的字符串字符串:
["] { BEGIN(STRING_LITERAL); init_string_buffer(); }
<STRING_LITERAL>{
\\\\ { add_char_to_buffer('\\'); }
\\\" { add_char_to_buffer('\"
我在做一个Flex&Bison项目。我让我的flex&bison完美地工作,但我正在尝试为true argv提供输入字符串。所以我改变了yyin,所以它使用了argv[1],但实际上它不起作用。它只是忽略了它
这是我的主要观点
#include "parser.hpp"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
int main(int argc, char const *argv
我有一个特殊的结构,调试时遇到了问题。
我希望这一积极的简化恰当地说明了这一问题:
%token VAR IDENTIFIER NUMBER INT
%%
root:
code_statements
;
code_statements:
code_statement
| code_statements code_statement
;
code_statement:
var_statement
| expression_stateme
在cygwin环境中使用flex/bison而不是lex/yacc运行(§4.3)中的示例6时,我得到了意外/缺少的输出
我从下载部分下载并解包。在example6.compile文件中,我将“lex”替换为“flex”,否则保持原样(命令yacc在cygwin上执行exec'/usr/bin/bison'-y“$@”)。然后我运行example6.compile。它运行时没有错误,但有一些警告(见附录)。
然后运行示例6,输入示例文本:
zone "." {
type hint
我想使用flex和bison为mini C语言编写一个编译器。我的语言示例如下所示:
/* This is an example uC program. */
int fac(int n)
{
if (n < 2)
return n;
return n * fac(n - 1);
}
int sum(int n, int a[])
{
int i;
int s;
i = 0;
s = 0;
while (i <
我正在用GNUbison编写一个解析器来解析专有协议捕获的数据位。解析器具有以下标记:
H标题
D数据
T终结者
五个数字的D.e.数据令牌组成了一个大容量B
i、 e
理想情况下,输入应为
阿卡
所以我写了以下语法:
%%
CAPTURE : H PAYLOAD T { printf("[OK]");}
;
PAYLOAD : B
| PAYLOAD B
;
B : DDDDDD
%%
现在,为了
我并没有找到任何关于法律规则与诉讼形式的解释(或者我没有找到)。
以下是一个例子:
%%
^([ \r\t])*[abcd][^=].*
{
return TOKEN1;
}
%%
与之相反:
%%
^([ \r\t])*[abcd][^=].* {
return TOKEN1;
}
%%
我知道%%必须在没
标签: Bison
rulesoperator-precedence
以下是语法规则:
ProcessExpression : EventExpression "->" ProcessExpression
| ProcessName ;
请你告诉我,我怎样才能告诉野牛,第一条规则的优先级高于第二条规则
我试过:
%nonassoc PROC
%right "->"
ProcessExpression : EventExpression "->" ProcessExpression
我是Flex/Bison新手,我尝试为现有语法创建一个小的“解析器/词法分析器”
我使用以下命令
"bison/bin/bison.exe" -dv -p osl -o oslgram.cpp oslgram.y
pause
"flex/bin/flex.exe" -+ -o osllex.cpp osllex.l
pause
但是我有一些错误。。。真的,我不明白这是什么意思!如果有人有使用此工具的经验,这将是伟大的
oslgram.y: conflits: 1 décalage/réduc
PCYACC中是否有一个关键字相当于BISON的关键字:
我在中没有看到任何相应的命令行选项或语言功能。我们可以给规则(而不是运算符)以优先级吗?
%expect NUMBER
我必须为类c语言创建一个词法和语法分析器。在这种语言中,我们将注释定义为“符号//之后直到行尾的所有内容”。每次我的编译器到达“/”时,它仍然会给我语法错误
%%
[ \t] { }
[0-9]+ { SAVE_TOKEN; return TINTEGER; }
"main_loop" { return TOKEN(TMAIN); }
"{" { retur
标签: Bison
yacclexflex-lexer
与flex/bison有问题。我执行一条语句,结果仅在执行第二条语句后出现。为什么?
以下是我想要的:
d>5
3 = 5
5+6=
11
PR 2+3
5
d>5
3 = 5
以下是我得到的结果(注意结果的底部):
这里是flex:
%{
#include "calc.tab.h"
#include <stdlib.h>
%}
%%
[ ] {}
[0-9]+ { yylval = atoi( yytext ); return NUM; }
[a-z]
标签: Bison
yaccflex-lexerlex
我有两个文件,我正在使用它们来尝试生成一个解析器
文件1:drive.l
%{
#include<stdio.h>
#include<string.h>
#include"y.tab.h"
/*
#define START 1
#define STOP 2
#define FWD 3
#define BACK 4
#define UP 5
#define DOWN 6
#define TURN 7
#define LE
我正在自学Flex/Bison,我正在用VHDL 93做一些实验。我对一些使用花括号的语法“productions”(在标准中称为productions)有问题
我理解标准中给出的示例的含义和转换方法:
term ::= factor { multiplying_operator factor }
term ::= factor | term multiplying_operator factor
但是关于:
choices ::= choice { | choice }
我不知道如何转换这
标记“错误”的含义是什么?如何在没有错误的情况下检测错误 匹配错误伪终端后,bison解析器继续以正常方式进行解析,但它会丢弃无法处理的令牌
如果遇到紧跟在错误令牌之后的令牌,它可以移动该令牌,这意味着它将停止丢弃令牌
但是,这不是解析器处理令牌的唯一方法。它也可以通过做一个减少来处理它
这里,handled一词的解释有点松散,因为reduction操作实际上并不接受lookahead标记。尽管如此,这足以减少误差产生
在这种情况下,必须注意不要打电话给yyerrok。如果使用yyerrok取消
经过几个小时的调试,我发现yyg->yy_bufer_堆栈指向了一些不应该指向的内存,后来导致了分段错误:
(gdb) print yyg->yy_buffer_stack ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] : 0
Cannot access memory at address 0x2aaaaaab0c680
(gdb) print yyg->yy_buffer_stack
$8 = (YY_BUFFER_S
我正在用Bison和Flex做一个小解析器来学习
我有一个问题,我希望能够将二进制或运算符作为
exp | | exp
其中字符“|”两次表示两个表达式的OR运算,一个向左,一个向右
但我也希望能够将绝对值定义为
| exp |
其中字符“|”像括号一样用于表示表达式的绝对值
现在我遇到了解析器无法正确解析字符串的问题,比如
| exp |+exp |
我想将其解析为
(|)(| exp |)+(exp)|)
表示一个表达式与另一个表达式相加的绝对值的绝对值
在这里,我的解析器将前两个管道字符作
我有一个错误,但我很困惑解析器认为令牌是什么。我在yytname处看到一个名称数组和一个名为yytokenName的函数,但它们是静态的
在我的错误规则中,如何打印或传递错误标记的名称?如果使用glr选项,则yyerror有一个YYLTYPE参数,该参数包含词法分析器提供的标记位置
您好,我刚刚开始在bison/yacc中进行一些解析。现在我的第一个程序已经失败了。出了什么问题?我使用的示例来自:
试试看:
expr:
INTEGER { $$ = $1; }
| expr '+' INTEGER { $$ = $1 + $3; }
| expr '-' INTEGER { $$ = $1 - $3; }
bison/yacc不喜欢右递归。如果输入是1+2+3,当解析器到
我正在尝试构建一个if()else if()else if()else示例。是否有任何方法可以在不使用%nonassoc并指定终端符号的情况下修复此问题?
正如您在代码中看到的,我有一些flex和bison。在flex中没有任何关键字elseif,只有else和if
Flex
keyword_if [Ii][Ff]
keyword_else [Ee][Ll][Ss][ee]
keyword_start [Ss][Tt][Aa][Rr][Tt]
keyword_then [Tt][Hh]
标签: Bison
compiler-warningsshift-reduce-conflict
我正在尝试制作一个编译器,现在我正在尝试制作解析器。
我在这种状态下收到警告:
州89
62 expr: '(' expr . ')'
66 | expr . '+' expr
67 | expr . '-' expr
68 | expr . '*' expr
69 | expr . '/' expr
70 | expr . '%' expr
74 | expr . '&' expr
75
标签: Bison
yacclexflex-lexer
其他人遇到了我遇到的以下问题,但我找不到任何人报告解决方案。。让Flex发现EOF(文件末尾)。我需要Flex找到EOF并返回一个标记,表明它已经找到了它,这样它就可以告诉Yacc/Bison它已经到达了输入源文件的末尾,并且可以报告成功的解析
注意,这与本文不同,因为这是关于Lex/Flex的
任何帮助都会很棒。谢谢。Flex
仅匹配文件结尾的模式。
可能您可以向解析器返回一些表示文件结束的标记
如下所示
<<EOF>> return END_OF_FILE;
标签: Bison
parser-generatorjison
我正在阅读《Flex和Bison》一书,以了解解析器生成器的工作原理,其中有一个示例:
calclist: /* nothing */
| calclist exp EOL { printf("= %d\n", $1); }
;
exp: factor
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor: term
| fa
我正在使用Bison和Flex。
我的Yacc输入文件中有以下规则:
program : PROGRAM m2 declarations m0 block {cout << "Success\n"} ;
program:program m2声明m0块{cout下面是一个这样做的示例:
首先是lex文件:
%{
#include "grammar.tab.h"
%}
%x REALLYEND
%option noinput nounput
%%
"END"
我想识别reduce/reduce冲突。
当两个或多个规则应用于相同的输入序列(令牌)时发生
例如:
Expr:num {$$=$1};
|Expr '+' Expr;{};
|Expr '-' Expr;{};
有谁能简单地给出一些如何识别减少/减少冲突的想法吗?好吧,你已经描述了冲突之间的区别。问题是什么
shift/reduce冲突意味着bison不知道是应该shift(读取一个终端并将其放在堆栈顶部)还是reduce(将堆栈上的多个终端/非终端转换为新的非终端)sh
“Flex/bison”;非C++&引用;
我想知道Flex/BySon的存在,它的工作方式与C++语言不同。我所能做的就是谷歌开发的自己的解析器,类似于Flex/BySun,但是我在寻找一个仍然使用.Y和.L文件的程序,语法类似,但是它使用的是不同于C++的不同。在java世界中,它是ANTLR:这里有一个一般的列表:@ Rusi:我不相信这个列表在大约15年内被更新了。维基百科的列表可能更好,但所有这些列表都需要谨慎使用。@rici为什么不把维基百科链接放进去?我刚刚评论了谷
标签: Bison
readlineflex-lexer
有人能帮忙吗?我的代码可以在branchreadline下载,您应该使用-g标志进行编译,这样gdb就可以显示更多的调试信息。如果您这样做,您将看到程序在尝试使用sh_line时在函数inp_readline中崩溃,该函数为空
原因是您将sh_-line0(将被解释为空指针)作为其初始值,然后在inp_-readline中检查sh_-line是否为非空,在这种情况下,您将释放旧字符串并使用readline读取新字符串。但是如果它是空的,它在开始时是空的,什么也不做,所以当你到达strlen(sh
此switch语句处理一种情况,如何使其成为多个情况
S: Statement {printf("ACCEPTED");}
声明:交换机BRO ID BRC CBO E CBC
E: A
| A C
A: A B
| CASE DIGIT D
B: BREAK SEMI
C : DEFAULT D B
D : COLON ID SEMI
;
这是一个问题,我想让语法在多个情况下被接受
你的语法很糟糕,不能解释重复的大小写。你需要发现如何表达事物的清单。一
我有一段EBNF语法,我想转换成Bison语法
E ::= {S [`;´]} [L [`;´]]
我没有太多语法方面的经验,但我想我设法弄明白了其中有一些可选部分和一些重复
我的尝试:
E: S semiColOp E lOp semiColOp
;
semiColOp: /* No Action*/
| semiCol//';'
;
lOp: /* No Action*/
| laststat
;
我不能测试这个at
我的语法包含:
expression : NUMBER { $$ = new Int($1); }
| identifier { $$ = $<expr>1; }
| INC identifier { $$ = new UnaryOperation($<expr>2, O_ADD_BEFORE); }
| identifier INC { $$ = new UnaryOperation($<expr>1, O_ADD_
我的代码中有一部分允许你发送一个错误,因为当这个错误出现时,我会做其他的事情
如何使bison在运行时不打印“语法错误”
s19 : s19tex otros CORTAR otros ROJO otros FINLINEA f3
| s19tex otros CORTAR otros AZUL otros FINLINEA fdeath
| s19tex otros CORTAR otros VERDE otros FINLINEA fdeath
| s19te
我有以下Bison语法片段:
binary_op: BINARY_OP
{
...
}
| '|' %prec BINARY_OP
{
...
}
;
non_keyword_expr:
1 2 3 4 5 6 ...
下一页 最后一页 共 11 页