我的语法有以下两个标记声明:
%token RP
%token ELSE
这两条规则是:
Statement : IF LP Exp RP Statement;
Statement : IF LP Exp RP Statement ELSE Statement;
据我所知,规则的优先级由其最后一个非终结符的优先级决定。因此,第一条规则具有RP优先级,第二条规则具有高于RP的ELSE优先级。下面是bison的输出:
state 73
11 Statement: IF LP Exp
标签: Bison
flex-lexeryaccebnf
我正在用lex/yacc编写程序语法。我有一个关于语法歧义的问题,我需要看看EBNF语法。当我搜索yacc及其声明的语义时,我看到了分组({…}),但我不知道如何初始化它。例如,选项([…])用|初始化
%token PROGRAM ID SEMICOLON
program:
PROGRAM ID SEMICOLON
| PROGRAM ‘,’ ID SEMICOLON
有没有这样的分组方法 yacc不支持EBNF,因此需要将EBN
idlist在这里是idtype类型。我是Yaac的新手。我是否做了一些愚蠢的事情,因为我的代码是通过一个id循环的。当我在一个级别上使用它时
因此,这里的语法在ID之后有类型。我可以使用堆栈来实现这一点,但我认为这很可爱。问题是您使用的地址是$1,这是一个仅为该规则操作而存在的本地临时地址。因此,在操作完成后,它就会消失,留下$$.ptr悬空,并指向将被重新用于其他用途的内存
idlist : idlist ',' ID {
$$.str=$
我正在尝试为一种类似于微型Pascal的语言制作一个编译器。我使用Flex和Bison来解决这个问题,我发现了这个错误
我的Flex文件:
%{
#include "y.tab.h"
#include <stdlib.h>
#include <string.h>
#include <math.h>
void yyerror(char *);
%}
%%
[1-9][0-9]* {
yylval.i = atoi(yy
我知道我可以在.y文件中声明%parse param{struct my_st*arg}。因此yyparse()被更改为yyparse(struct my_st*arg)。但是如何引用flex规则中的参数呢?例如:
[0-9]+ { do_work(arg); return NUMBER; }
我想做一个可重入解析器,所以我需要这样做。请帮帮我,谢谢 您需要将参数传递给yylex。这需要修改bison解析器描述,以便解析器使用所需参数调用yylex,以及flex scanner描述,以便扫描
我正试图编写一个Cminus(C子集)编译器,但我的教授要求我们能够处理input()和output()函数作为系统调用(上学期我们实现了一个RISC CPU,可以处理这些指令)
对于输入()。因为这个函数应该以数组或变量作为参数,所以我假设在Lex模式上,我需要这样的东西(参考我读到的内容):
但我的语法有以下定义:
type: INT | VOID;
fun_decl: type ID LPAREN params RPAREN comp_decl;
其中ID是Lex给Bison的一个标记,
我想将yylval定义如下:
%union {
int ival;
char *sval;
struct s_con {
char exp[30];
vector<Where*> v_wheres;
} *p_s_con;
}
%union{
国际竞争力;
char*sval;
结构s_con{
char-exp[30];
向量v_在哪里;
}*p_s_con;
}
这里是,其中是一个类。
然后我在y.tab.
如果循环结构在*.y文件中定义为:
WHILE '(' expr ')' stmt ENDWHILE { //to be written here loop structure handling
- put WHILE into structure stack }
然后-尽管我被迫使用ENDWHILE-我如何将c代码绑定到ENDWHILE以检查结构之间是否存在重叠?只有在识别所有以前的标记和规则(以及执行任何代码)后,才会执行示例中大括号中的代码
如果您有嵌套的WHILE/ENDWHILE循环
标签: Bison
calculatorflex-lexer
我是使用bison和flex的新生。
我下载了gnu bison官方网站提供的软件包。
有一个例子文件夹包含C++中的计算器的源代码。
以下是下载链接:
我采取了以下行动:
bison-d calc++-parser.yy=>OK,生成calc++-parser.tab.hh和calc++-parser.tab.cc
flex-calc++-scanner.ll=>OK,生成lex.yy.c
cc-o a.out lex.yy.c calc++-parser.tab.cc-lfl=>失败
我不知
标签: Bison
flex-lexerlexer
我有一台扫描仪,它保持两种独占状态(WORD和DEFN)
%选项noyywrap
%s字
%s DEFN
%%
%{
开始(单词);
%}
{
“|”{BEGIN(DEFN);返回WS_PIPE;}
}
{
[^;]+{printf(“ds:%s\n”,yytext);返回WD_STRING;}
“;”{返回WD_分号;}
}
\n |。{printf(“U:%s\n”,yytext);}
%%
但是,通过简单的输入“| some text;”,当解析管道时,状态没有改变,因此对“some t
我研究了Bison的语法,有一个关于一些结构的问题,比如
bodystmt:
{
$<num>$ = parser->line;
}
bodystmt:
{
$$=解析器->行;
}
我知道$$和$1,num是一种类型。。但这对我来说是一个新事物,它是一个显式的类型标记,覆盖该值的声明类型。因此,如果你有:
%union {
int num;
char *str;
}
%type<st
我在野牛身上犯了一个错误,我不知道如何纠正
在尝试编译语法时,我遇到1个shift/reduce错误:
START: type_specifier MAIN LBR_R RBR_R LBR_C program RBR_C
program: statement ;
type_specifier: INT | DOUBLE | VOID;
var_declaration: type_specifier var_declist SECOLON;
var_declist: var_decli
标签: Bison
flex-lexeryacclex
I.l
测试
野牛给了我一个错误
$ make clean && make debug
$ ./a.out < sample.ini
1: syntax error at [
$ make clean && make debug
$ ./a.out < sample.ini
[Token: 258/IDENTIFIER (foobar)
Token: 259/BRACKETS_RIGHT (])
Token: 258/
标签: Bison
flex-lexeryacclex
我对莱克斯和亚克还很陌生。我正在尝试一种语法来识别输入文本:escliver 1或ESCRIVER 1+2但每次我尝试它时都会显示语法错误,我认为问题在于解析数字或单词escliver
这是我的flex/lex代码
%{
#include "gram.h"
int yyerror(const char *s);
%}
/* letras [A-Za-z]+ */
/* id ({letras})({letras}|{digito})* */
%%
"ESCREVER"
我知道在Bison代码中,可能会出现一些移位/减少冲突,正常的C语法会为if/else生成一个移位/减少冲突。然而,我有一个语法,可以产生330个其他移位/减少冲突。这表明我的语法有严重问题吗?我是否应该花时间查找每个冲突并尝试解决或验证其正确性?我正在使用一个常规的LALR解析器
编辑:
这是我的语法,我去掉了所有的动作和其他东西
%token STRING_LITERAL
%token INTEGER
%token FLOAT
%token CHARACTER
%token PTR_OP I
标签: Bison
yacclexsegmentation-fault
我在逻辑运算符方面有问题
在我的.y文件中,我有:
expr: expr oper1 expr { $$=insert_expression($2, $1, $3); }
| expr oper2 expr { $$=insert_expression($2, $1, $3); }
;
在我的.l文件中,我确定oper1和oper2是:
"<" | ">" | "=" | "<>" | "<=" | ">=" { return oper1
我正在尝试为C语言的一个子集构建语法。在我的一些规则中,我有以下内容(pNode是在union中定义的指针):
规则:{$$=$0;}其余的
但是,在阅读Bison文档之后,似乎可以忽略该操作,因为$0已经引用了堆栈中的前一个符号。我说得对吗
如果能够省略该操作,那就太好了,因为它会导致一些原本不会出现的移位/减少冲突。此代码复制值堆栈上的顶部值(对于此规则,使复制的$1),因此,这可能是不必要的——如果所有使用其中一个复制值的代码都可以更改为使用未复制值,并且如果没有任何代码尝试修改堆栈上的
标签: Bison
yaccuntyped-variables
我正在使用byacc来构造语法,但是当我想使用yyerrok时,它对我说byacc:e-line 44 of“bee.y”,$$是非类型的
如何解决这个问题?()
@格雷兹写道:
您收到此消息不是因为yyerrok的使用。原因是$$=0,即您没有将类型分配给非终端定义(如@templatetypedef所述)。您可以将每个生产关联到一个操作。每个动作都可能返回一些语义值,这些语义值可用于“更高”的生产。此外,您可以(或应该)为每个非终端和终端指定语义值的类型。看看bison doc:,特别注意语
我想用一个操作符编写一个语法,比如Matlab冒号操作符,其中“a:b”和“a:b:c”的意思稍有不同。我更希望操作符是非关联的,因为“a:b:c:d”等没有意义
下面是我语法的精简版本,以展示我是如何尝试做到这一点的:
%union {
int ival;
}
%token tINT
%nonassoc ':'
%%
program: { }
| expression ';' { }
expression: tINT { }
| expressi
标签: Bison
dslcontext-free-grammarjison
我刚刚开始编写DSL,希望使用JISON()。我试图学习语法,但在双引号中指定字符串时遇到了问题
我认为有效的方法是:
%lex
%%
[\n\s]+ /* skip whitespace */
"true"|"false" return 'BOOL'
"IF" return 'START'
"AND"|"OR" return 'LOGIC'
<<EOF>>
因此,在我的语言中,我希望有点语法表达式:
myObject.myProperty
myObject.myProperty.subProperty
我想要声明
Object myObject = 1
此外,对象类型可以使用名称空间:
Object.SubObject mySubObject = 1
简化语法如下:
program:
declaration;
| expression;
declaration:
TOKEN_IDENTIFIER TOKEN_IDE
标签: Bison
flex-lexeryacclexrule
我想为单个查询解析文本。此查询将以分号结束。它将类似于sql。例如:创建表'somename'
我的y文件是
%{
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
#include "ast.h"
extern int yylex(void);
extern void yyerror(char const *msg);
QueryNode
假设“int”是一个类型,第一个表达式是类型转换,第二个表达式只是一个简单的加法,或者如果“a”是一个类型别名,那么bison将如何解析/解决这个表达式中的冲突,我感到困惑。假设该语言允许为现有类型指定别名
x = (int)+b => typecast to "int" the "+b"
x = (a)+b => addition expression / typecast to "a" the "+b"
标签: Bison
yacclexflex-lexer
我有一个文本文件,我正试图解析它。该文件如下所示:
A_1: - A_10:
Some text.
----------
Some more text.
__________
B_1: - B_5:
Still more text - it may contain dashes as well.
----------
Even more text. Could be multiple sentences with newlines.
Like this.
__________
等等
我试图在
标签: Bison
reduce-reduce-conflict
具体情况是,在分析AST之后,当规则完成时,我将知道是否存在错误。我尝试了一个错误(“胡说八道”),但没有成功
因为我不能告诉它有错误,它完成了另一个规则,现在有一个reduce/reduce冲突。这很烦人,因为我知道其中一个是无效的,而不看另一个,但用户必须忍受bc我不知道如何说忽略这个分支bc无效
如何解决此问题?您需要创建一个没有减少/减少冲突的语法您想要的yyrorm不是yyrorm——将yyrorm放入一个动作会导致解析器将该动作设置为语法错误,并进入错误恢复模式(如果您的解析器中有任
我使用的是Bison,生成了一个相当复杂的语法。问题是我的第一个测试用例失败了——但Bison只会说“语法错误”。有没有办法让Bison输出不匹配的规则和出现问题的令牌?我曾经
%define parse.trace true
但是仍然只能将语法错误作为输出。如果将全局变量yydebug设置为非零值,bison将在运行时输出调试信息,其中包含解析堆栈的外观、状态、使用的规则等信息,这就是我通常调试此类错误的方式。使用%error verbose指令来帮助您。它将为您提供解析器所期望的标记的提示
标签: Bison
yacclexflex-lexer
我不熟悉lex/yacc,我正在使用lex/yacc编写SQL解析器。但是对于下面列出的特定连接查询,我的解析器故意访问“select_statement”规则,而不是“nested_JOIN_statement”规则
我得到了这个查询的正确输出:从sample1中选择*JOIN sample2 ON sample1.C1=sample2.C4;
这将转到“join_语句规则”,满足中的简单_连接规则
但是当我尝试这个查询时:SELECT*FROM SELECT*FROM SELECT*FROM
我正在努力理解yacc递归。所以我创建了一个最小的语言,我想简单地回显给它的数字列表。我用的是JISON。以下是JISON:
/* description: Parses end executes mathematical expressions. */
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
[0-9]+("."[0-9]+)?\b return 'NUMBER'
<<
这里是野牛新手
我正在尝试向我的玩具计算器添加一个功能,它可以在任何变量之前省略乘法运算符*,这样它就可以解析如下内容:3x*2y
我将程序简化为一个非常简单的解析器,它只支持乘法(显式和省略),其中数字由字符n表示,变量由字符v表示
下面是一个输入示例,类似于上面的示例,应该接受:
nv*nv
更复杂的示例也可以使用(请忽略空白):
nvv*n*nvvv
这是代码文件calc.y:
%start expression
%left '*'
%%
expression:
'n'
|
我想创建一种由多个字符变量(例如abc=10,num=120)组成的编程语言。我能够创建单字符变量。.y代码为:
%{
#include <stdio.h>
//char sym[1000];
//int x=0;
int sym[26];
%}
%token NUMBER ADD SUB MUL DIV ABS EOL ID ASS
%%
calclist :
| calclist exp EOL {
标签: Bison
yaccshift-reduce-conflict
我有以下yacc语法:
33 CompSt: "{" DefList StmtList "}"
34 | "{" error ";" DefList StmtList "}"
......
52 DefList: Def DefList
53 | %empty
54 Def: Specifier DecList ";"
55 | Specifi
我正在和Bison一起定义语法,我偶然发现了一个我想消除的移位/减少冲突。冲突是由旨在匹配if/else语句的规则引起的:
state 17
13 Stmt: IfBlock . OptionalElseBlock
ELSE shift, and go to state 42
ELSE [reduce using rule 16 (OptionalElseBlock)]
$default reduce using rule 16 (Optiona
标签: Bison
yacclexflex-lexerlexical-analysis
考虑这个lex.l文件:
%{
#include "y.tab.h"
%}
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SL
你好
我正在学习yacc,在理解某些东西时遇到了一些问题
这是我的.y文件的一部分:
statement: statement expression '\n' {$$=insert_expression_list($1, $2); printf("1\n");}
| expression '\n' {$$=insert_expression_list(NULL, $1); myprogram=$$; printf("1.1\n");}
;
ex
我一直在将解析器/词法分析器转换为可重入实现,最后一个障碍是能够执行嵌套的include script.txt类型指令
这是我为include位实现的:但它会seg错误,否则标记器和解析器的其余部分工作正常:
^{include}{ws}+ { BEGIN INCL; }
<INCL>[^ \t\n\r\f]+ { /* Swallow everything up to whitespace or an EOL character.
标签: Bison
abstract-syntax-tree
我是野牛队的新手。我正在尝试实现一个解析器。我面临的主要问题是解析树。我得到一个与树相关的错误,我无法消除。上面写着“未知类型名‘tree’”。这是我的y档案。如果有人能帮我解决这个问题,我会很高兴的。我非常需要解析器。提前谢谢
%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"error FAIL: %s\n",str);
如何在Flex中将用户输入转换为小写?在网上看了一下,但没有发现任何有用的东西
当我尝试这样做时:
yylval.string = strdup(tolower( yytext) );
我得到一个错误声明:传递'tolower'的arg 1将从指针生成整数,而不进行强制转换
谢谢,
Sarah您可以在顶部的“C”部分重新定义宏:
#define YY_INPUT(buf,result,max_size) \
{ \
int c = '*', n; \
我试图用bison和lex创建一个c类型解析器。是的,这是一个学校作业,但我很迷路,我做学校在线,所以我没有得到太多的帮助。我需要它来将信息解析到一个表中,但是我很确定parse.y文件中有错误,因为它没有将信息加载到表中,它说没有代码。我知道我的.y文件缺少一些语法,但我认为其中一些应该按原样加载到符号表中
运行make文件时的输出是:
default:
clear
yacc -d -v --debug parse.y
lex -l scan.l
gcc -o
标签: Bison
yaccparser-generator
我使用Jflex、byacc、java解析语句
where expr,expr having expr
语法看起来像
%token WHERE HAVING COMMA
%%
stmt : whereclause havingclause
whereclause : WHERE conditionlist { move tmpList to whereClause};
havingclause : HAVING conditionlist { move tmpList to havingC
我正在读一些用于解析C程序的Bison代码。有人能告诉我下面代码中$7和$8的含义吗?因为我在两种情况下只找到6和7描述来描述枚举类型
enum_name:
enum_key
gcc_type_attribute_opt
{
init($$);
PARSER.new_declaration(stack($1), symbol, stack($$), true);
PARSER.copy_item(to_ansi_
标签: Bison
yacccontext-free-grammar
当我试图“编译”我的yacc文件时,我似乎找不到上述错误。我希望有人能指出问题所在,让我知道我需要做些什么来纠正问题。我已列出我的文件:
%token Identifier Int Real_Num And Array
%token Begin Boolean Div Do Else
%token End False For Goto If
%token Imply Integer Label Not Or
%token Own Procedure Real Step String
%token
我试图从遗留代码中理解flex规则,您能帮助我:
number [0-9]*['']s?[bdh]
“”(两个单引号)是什么意思?它是否意味着一个单引号,其中第一个引号符号是后面提到的实际引号的转义?我的印象是特殊字符需要用反斜杠标记,如[\']。如果“”表示,那么使用反斜杠作为转义字符的正确方法是什么
这里的“s”符号是什么意思
你能举一些例子说明这两段正则表达式在哪里匹配吗
我认为双撇号只是一个错误。括号定义字符集,撇号没有特殊含义。括号内双撇号的含义与仅包含一个撇号的字符集的含义相同,
例如,我在.ypp中有以下声明:
%{
#include <iostream>
#include <stdlib.h>
#include "structs.h"
#include "func.h"
#define YYSTYPE Types
%}
%union Types{
int Integer;
bool Boolean;
Expression Exp;
};
在“func.h”中,我有以下函数:
int binop(Types& a,
标签: Bison
calculatorflex-lexer
我正试着在FLEX和BISON中做一些练习
以下是我编写的代码:
calc_pol.y
%{
#define YYSTYPE double
#include "calc_pol.tab.h"
#include <math.h>
#include <stdlib.h>
%}
%start line
%token NOMBRE
%token FIN
%%
line: exp '\n' { printf("\t%.2lf\n", $1); };
exp: exp exp '+'
我试图编写一个yacc语法来识别以下模式:
AAAA -> Multiple As
BBBB -> Multiple Bs
AAAABB -> 2 As followed by (AABB)
AAABBBBB -> (AAABBB) followed by 2Bs
通常,我希望将相邻As和Bs的相等块分组在一起,优先于As或Bs的运行。直截了当的语法说明了一系列冲突
我需要一种方法来优先考虑这部作品
T -> | AB | ATB
结束
(其中T和U为ya
标签: Bison
reduce-reduce-conflict
我在bison中得到了以下语法的reduce/reduce冲突,因为n也是epsilon产生式
m : {$$=line_no;}
;
n : {
$$.nl=makelist(line_no);
codelines[line_no].opcode=GOTO;
标签: Bison
flex-lexeryacclex
我最近发现了lex和yacc(以及flex和bison),当我试图告诉程序是否给出了一个句子时,出现了一个错误
以下是.lex文件:
%{
#include <stdio.h>
#include "1.tab.h"
%}
%%
tweety|sylvester return NP;
a|the return AR;
cat|bird return NC;
run|fly return VI;
eat|hate return VT;
"." retur
所以我的代码有一个奇怪的问题。虽然词法分析器成功地识别了所有的标记,但当从输入文本文件读取时,它不识别新行(保持在第1行),并且在每次成功识别标记后,它都会给我一个奇怪的错误。这是我的密码:
%option noyywrap
%x error
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "token.h"
int line = 1;
void ERROR
假设我有以下规则:
rule1 : TOKEN rule2 TOKEN { printf("Found TOKEN\n") ; }
rule2 : ATOKEN { printf("Found ATOKEN\n") ; }
在这里,输出将如下所示:
Found ATOKEN
Found TOKEN
因为规则2将首先减少。有没有什么方法可以让我一拿到代币就打印一些东西
N.B我知道当它与令牌匹配时,我可以从扫描仪中执行此操作,但我需要从bison打印它。bison允许在规则内执行操作(称为)
标签: Bison
incompatibility
我必须支持bison版本3.0.4和3.4.2的系统
我在.y文件中使用了变量parser\u class\u name。3.4.2不再支持此选项
error: syntax error, unexpected string, expecting identifier
它的替代品是使用api.parser.class,但这不适用于3.0.4:(请参阅Bison 3.3中引入的:History:来替代parser\u class\u name。)
如何在.y文件中解决此问题?如果在bison的语
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 15 页