我想把数字加在一行上
e、 g
为此,我认为以下正则表达式就足够了:
((NUMBER)* "\n")+
我使用lex/yacc组合来实现它。我知道lex就足够了,但这只是一个小的一次性程序,专门用来了解yacc是如何工作的
我为上述正则表达式编写了以下语法:
lines -> lines line
lines -> line
line -> numbers '\n'
numbers -> numbers NUMBER
numbers -> (empty)
我正在用类似python的语言创建bison语法,运行测试代码文件时得到的输出如下:
found identifier a at line 2
memory exhausted
Parsing completed successfully
我得到一些shift-reduce错误和reduce-reduce,但我可以正常创建我的.exe文件,如果我运行它,它会显示这一点
我已经试着把我大部分的班次减到零。但这真的是问题所在吗?因为我想它不会给我一个.exe
.l文件
%{
#include &
我试过下面的lex和yacc文件,似乎有很多函数的多个定义,比如yylex、yyrestart等等。我尝试了几种方法和在线材料,但无法解决它。任何帮助都将不胜感激
try1.l文件如下所示
%{
#include "y.tab.h"
int linenum=1;
int temp_int;
%}
%%
\n {linenum++;}
[\t ] /* skip spaces */;
\/\/[^\n]* /* ignore comments
我正在学习与YACC合作,我真的无法理解一些错误。我想知道当我试图用.y文件生成解析器时,为什么会出现这个错误。这是my.y文件,它表示Pascal语言的上下文无关语法:
%%
Program : program ident ';' declaration_opc compound_stmt '.'
;
declaration_opc : var declaration_list
|
;
declaration_list : declaration ';' dec
这是我的yacc代码:
%{
#include<stdio.h>
extern File *yyin;
extern int line;
%}
%token DATATYPE NUMBER ID RET MAIN KEYWORD AOP HEADER STB ENB
%start START
%%
START:H MAIN STB S R ENB
H:HEADER H|HEADER
S:DS S
|ES S
在我的最后一个项目中,我留下了几个代码,其中一个是flex&bison的代码。问题是gcc会将消息返回给我
“错误:请求非结构或联合中的成员'n'
141 | |康斯坦特{$=narynew(“康斯坦特”)}”
在野牛档案中。。。我不知道如何解决这个问题
%{
#包括
#包括
#包括
#包括“parserMiniC.tab.h”
int yylex(无效);
无效错误(字符*);
类型定义结构节点{
字符*类型;
结构节点**子节点;
智力儿童;
}节点t;
typedef struct_l
还允许按位AND
7&5
如何解决/减少冲突?我的意思不是说使用glr解析器,而是完全没有冲突。示例语法问题是
var&var //could be type& var or logical val & val
您可以区分语法术语的顺序:
<type> & <identifier>
&
及
&
尽管在后一种情况下,您可能真的在处理:
<expression> & <expression>
我跟着老师学习flex&bison,
但是我被卡住了。当我用
g++snaszzle.tab.clex.yy.c-lfl-o snaszzle,
我收到以下错误消息:
snazzle.tab.c: In function ‘int yyparse()’:
snazzle.tab.c:1403: warning: deprecated conversion from string constant to ‘char*’
snazzle.tab.c:1546: warning: depreca
我是bison\yacc的新手,我正在尝试编写一个类似pascal的语法分析器,我得到了
analizorSintactic.y: conflicts: 1 shift/reduce
analizorSintactic.y:65.13-23: warning: rule useless in parser due to conflicts: decllist: declaration
我得到了以下语法规则的警告
program : PROGRAM IDENTIFIER SEMICOLON c
标签: Bison
flex-lexeryacclexautotools
我写了一个基于FlexLexer和bison的小文本过滤器。
布尔表达式应用于指定的字符串(logvar)。布尔表达式由字符串和布尔运算组成
例如:
*intput*:
logvar=aa bb cc dd ee
aa & bb
*result*:
true
*input*:
logvar=aa bb cc dd ee
aa & rr
*result*:
false
*input*:
logvar=aa bb cc dd ee
aa | rr
*result*:
true
我正在尝试使用flex++和bison编写解析器。我需要解析器能够读取文件并在输出中写入新文件
我将yyFlexLexer实例化如下:
yyFlexLexer lexer;
我用它:
int main(int argc, char* argv[])
{
std::istream* in_file = new std::ifstream(argv[1])
std::ostream* out_file = new std::ofstream(argv[2])
lexer.s
标签: Bison
context-free-grammar
我在以下语法上遇到了reduce/reduce冲突(excerp)
我看到当输入为:foo:=bar时,有两种可能的派生:
分配->标识“:=“参数和参数->标识
分配->标识“:=“expr和expr->标识
我在语法中使用了两次ID,因为变量的类型可以是path或scal。
如何在不使用glr解析器选项的情况下删除此冲突
我尝试将ID拆分为两种可能性:ID_PATH和ID_SCAL,并将productions param和expr更改为:
param : point relative_par
我是Flex和Bison的初学者,我有一些C的基本知识,我正在创建一个简单的解析器
这里的目标是填充以下结构:
struct numvariable {
int nodetype; /* type V */
char* value;
};
为了做到这一点,首先,我尝试打印用户在lexer working中输入的char*:打印用户输入的值,然后在parser not working中打印null
以下是lexer.l文件中的对应行用户输入的字符串在此处正确打印:
[a-z
我正在尝试实现一个简单的flex/bison代码,它将像程序一样检查C:
main(){
x = 3;
print x;
}
但是当我向程序提供这个输入时,它无法与我在flex文件中提到的规则匹配。下面是我的flex和bison文件代码:
计算
%{
#include <stdio.h>
#include <string.h>
#include "calc.tab.h"
int lineno = 1;
%}
digit [0-9]+
id [a-z][a
我有一个包含以下规则的yacc文件:
%start program
.
.
.
statement
: ';' { $$ = NULL; }
| expression ';' { $$ = exprStmt($1); }
| compound ';' { $$ = cmpndStmt($1); }
;
routine
: routine statement { $$ = rtn($1, $2); }
| { $$ = NULL; }
;
我试图从NetBSD源代码树编译简单文件,当我使用bison(GNU bison)2.4.2时,我遇到以下错误:
expr.y:75.14: syntax error, unexpected =
expr.y:82.29: syntax error, unexpected =
文件有什么问题,应该如何修复?有(或曾经有)一些yacc版本在{之前接受=,例如
exp: expr = {
...
| expr SPEC_OR expr = {
只需将所有发生的事件(在该文件中不超过
标签: Bison
yacclexflex-lexer
我一直在尝试向给定的前缀/中缀/后缀计算器添加位运算符,但由于某些原因,我无法使用yacc识别运算符“**”。我到处找过一些有类似问题的人,特别是这个问题,但没有找到有效的解决方案
我的莱克斯档案
%{
#include "zcalc.h"
#include <math.h>
int ch;
int flag = 0;
#define NAME 257
#define SEMISYM 268
#define COMMASYM 269
#define L
我正在阅读一些遗留的bison代码,它有如下规则:
function_decl: name body function_end
{ if($3 != $1->id) {
yyerror(@3, "error: function name does not match end label");
}
}
;
我理解$I是指规则中每个令牌返回的值。但是@i代表什么呢?我尝试在谷歌上搜索它,但没有得到任何相关的点击。@n是与符号$n对应的“
我一直在写一个类似C的语法,以供个人消遣。然而,我遇到了轮班/减少冲突,我非常确信它们可以得到解决
现在我的表达式看起来像这样,以简化的形式,没有动作:
%left '+' '-'
%%
expr
: NUMBER
| IDENTIFIER
| expr '+' expr
| expr '-' expr
/* other operators like '*', '/', etc. */
| expr '(' expr ')' /* function call */
%%
但是,这
这是我的.lex文件:
"Sphere" {return SPHERE;}
"(" {return LBRACKET;}
")" {return RBRACKET;}
"." {return DOT;}
[a-zA-Z][a-zA-Z0-9]* {yylval.s = yytext; return NAME;}
[ \t\n]+ /* ignore */
. return yytext[0];
这是我的bison.
以下(简化的)Bison语法产生一个reduce-reduce冲突:
expr
: '(' expr ')'
| ID
| fn
;
arg_list
: ID
| arg_list ID
;
fn
: '(' ')' fnbody
| '(' arg_list ')' fnbody
;
fnbody
: '{' '}'
;
我只看到了一个前瞻标
大家好,
我用lex语言编写了一个简单的代码,我试着用“bison-d hello.l”运行它,但我发现了一个错误!
我得到以下错误
有人能告诉我我错了什么吗
bison -d hello.l
hello.l:4.1-5: syntax error, unexpected identifier
代码:
%{
#包括
%}
数字[0-9]
ID[a-z][a-z0-9]*
%%
{数字}+{
printf(“一个整数:%s(%d)\n”),yytext,
原子能机构(文本);
}
{DIGIT
标签: Bison
operator-precedence
我有一个关于Bison中操作符优先级和结合性的问题
在每个示例中,我看到的产品都类似于expr'op'expr,例如:http://dinosaur.compilertools.net/bison/bison_8.html
但是,如果我使用bison%left和其他关联性工具,我会使用如下语法:
expr| expr binop expr
| expr relop expr
| expr logical_op expr
及
binop:'+'
标签: Bison
yacclexflex-lexer
我有一个lex模式文件(test.l),其中我想识别IPv4地址和IPv6地址的模式
目前我使用的是二进制模式表示法
src -ip of 192.168.156.203 is to be written as
1 src-ip {11000000 10101000 10011100 11001011}
其中“1”是我用于分类的标记。我希望扩展此模式以包括IPv4地址(点十进制)和IPv6地址(四元表示法)
目前,我的词法分析器文件(test.l)的相关部分如下所示
BINARY_
我是否需要使用64位bison exe单独编译此parse.y文件,然后将其包含在我的64位迁移项目中,或者应用程序将工作文件而不使用64位bison exe单独编译此parse.y文件为什么您认为生成的代码中会出现32/64问题?只需编译输出,它就可以工作。使用gcc,您可以使用-m32或-m64选项以x86或x64位代码交替编译:您的意思是,在编译.y文件时,我将生成与输出完全相同的“tab.c”文件,即32/64位bison exeFYI,最后是bison 2.3,当它试图将int插入带有
我正在研究bison(yacc),但我有一个疑问,我如何才能使处理文件包含在源代码(#include)中,如何创建函数并分析和yacc生成这些函数的代码
我编写了一个简单的测试代码:
但是,没有功能系统和#包含系统。。。我只是试着去做,但是做错了,它在编译时出错了,当编译时,它不起作用。。。然后删除进行这些更改的源,并一个新的…bison调用函数yylex读取令牌。如果你正在定义你自己的yylex,你可以在任何你喜欢的地方阅读它;您只需将该源转换为一系列令牌。如果您使用的是flex,那么它有
我正在写一种简单的Basic语言。出于某种原因,我想避免使用'call'关键字,所以我不使用'call my_subroutine'来调用子例程,而是简单地使用'my_subroutine'。
例如:a=8:dou_某事:b=c+d
我有一个很好的方法来声明子例程。Flex也可以,它可以识别用户字符串中何时出现声明的子例程。然而,我在野牛宣言上有困难。我的工作如下:
%token CALLSUB。。。
stmt:
...
CALLSUB{$$=opr(CALLSUB,2,NULL,NULL);}
第13行是
"lexicale.l", line 13: unrecognized rule
"lexicale.l", line 13: unrecognized rule
代码是:
{idf} {printf("indetificateur\n");}
(F) lex模式不能包含无引号的空白字符
您的定义bool和定义idf都包含不带引号的空格。您应该从两个定义中删除空白
由于flex解析自己输入文件的方式有一个怪癖,因此在模式定义中报告的语法错误行号不是很准确。特别是,在扩展定义时报告
在此文件上运行Bison:
%{
#include <iostream>
int yylex();
void yyerror(const char*);
%}
%union
{
char name[100];
int val;
}
%token NUM ID
%right '='
%left '+' '-'
%left '*'
%%
exp : NUM {$$.val = $1.val;}
| ID
我已经工作了几个小时,我不知道如何从bison文件打印令牌,bison文件是这样的:(这是一个简单的短文件)
这是修改后的版本:问题的解决方案:
%{
#include <stdio.h>
#include <stdlib.h>
void yyerror(const char *);
int yylex(void);
int id;
%}
%union {
int d;
}
%error-verbose
%token <d> ID
%%
instr
我正在使用flex和bison实现一个解析器。我遇到的一个问题是,如何向解析器提供独立flex文件的标记。当我试图编译我的parser.tab.c时,它抱怨“对yylex的未定义引用”。
然后,我尝试在编译时设置-d选项,并将头文件包含到flex文件中
我只是想知道使用flex和bison(以及编译和运行的相关命令)的正确步骤,我正在使用gcc编译器
很多
/* Token Scanner for C- language */
%{
#include <stdio.h>
#inc
标签: Bison
shift-reduce-conflict
语法如下:
1. program -> declaration-list
2. declaration-list -> declaration-list declaration | declaration
3. declaration -> var-declaration | fun-declaration
4. var-declaration -> type-specifier ID ; | type-specifier ID [ NUM ] ;
5. type-spe
处理需要使用flex和bison来检查给定字符串是否使用某种语言的赋值。这只是在看到基本示例之后才出现的,在这些示例中,flex基本上是用来回吐读入的内容的
例如,格式为{a^n b^n c^n}且n>0的字符串将使用该语言。因此字符串aabbcc是有效的
flex是否有办法计算读取的特定字符数?例如,如果字符串aaabbbcc在给定的位置,它将计数3个a、3个b和3个c?或者我应该简单地使用flex检查输入字符串的格式是否正确,然后使用bison中的语法规则检查它是否在语言中
编辑
我已经做了
我正在使用bison解析器
要在错误消息中获取预期和意外的令牌名称,需要在生成的y.go文件中设置变量yyrerror\u VERBOSE。如何从.y文件中设置它?这里是一段语法片段
%{
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <strings.h>
#include "calc.h"
int yyle
标签: Bison
context-free-grammar
获取此错误。我正在粘贴一部分错误和语法规则
parser.y:警告:6个非终结符在语法中无用[-Wother]
parser.y:警告:语法中有15条规则无效[-Wother]
parser.y:95.1-16:警告:非终结符在语法中无效:
func_声明[-Wother]
func_声明:
^^^^^^^^^^^^^^^^
parser.y:113.1-15:警告:语法中的非终结符无用:func_定义[-Wother]
func\u定义:类型\u说明符ID LPAREN参数\u列表RPAREN
我是Bison的新手,很难理解如何表示“一个或多个”或“零个或多个”(即正则表达式中的+和*)
我正在尝试产生一种语法,比如:
单词单词。。。字
但是,我不确定应该在哪里终止递归序列。我直觉上认为我应该放置一些终结者标记的任何地方都会导致移位冲突
到目前为止,我已经成功创建了语法:
word_list
: word { printf("parsed first word: %s\n", $1); }
| word_list word { printf("parsed follo
标签: 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)|)
表示一个表达式与另一个表达式相加的绝对值的绝对值
在这里,我的解析器将前两个管道字符作
我试图在客户端和服务器之间建立一个消息的请求-响应序列。
为了解析消息,我使用了flex和bison语法。
我有一个关于在不同语法中重用规则的问题。
例如,如果我有一个语法来处理请求
req_message:
request_message
|response_message
|error
;
请求消息在哪里
request_message:
|request_header_list request_hdr
请求_hdr是
request_hdr:
标签: Bison
lexcontext-free-grammarbisonc++
有人知道这句话:
$default reduce using rule 1 (P)
谁是$default。。。
它应该是一个特定的终端,但是是哪一个呢?默认操作适用于未使用另一个操作指定的每个终端。因此。。。我想编译一个表,看起来像龙书中的表,我要把reduce操作放在哪里?谁是州号码,谁是对应的代币?非常感谢@弗朗西丝科兰扎摆好了桌子。填写所有指定端子的操作。然后在空框中填入默认操作。谢谢=D确定。。我现在才明白你的意思;)@蓖麻
我的程序有一个奇怪的错误
我的YYSTYPE的结构是
%union
{
char *text;
node *n;
}
%token <text> NUMBER
我是否遗漏了一些明显的信息?当您执行以下操作时:
$<n>$->left = $<n>$->right = NULL;
$$->left=$$->right=NULL;
您认为$$的值是多少?您是否已将其分配给节点对象的地址
为了节省时间:您没有分配它,
我正在用bison编写解析器。我遇到了一个问题,bison检测到了解析错误,但没有调用yyerror
下面是我处理类定义的脚本片段:
%{ ...
void yyerror(char *s);
Program ast_root; /* the result of the parse */
Classes parse_results;
}%
...
%%
/*
Save the
1 2 3 4 5 6 ...
下一页 最后一页 共 15 页