我有一个试图与bison -d一起使用的.y文件,但由于某种原因,无法生成.tab.h文件。有什么建议吗?
%{
#include <stdio.h>
int yyerror(const char* err);
%}
%token G
%token INT
%token X
%token Y
%token Z
%token END
%token ZERO
%token EOL
%%
program: list_of_expr
;
list_of_expr: expr
| list_of_expr expr
;
exp
我和Flex和Bison一起工作。在我的parse.y (野牛)中,我定义了令牌。当令牌返回时,它返回一个int,我想知道是否有一种方法可以将这个int转换回bison源中的实际名称。例如,在我的parser.y
//define my tokens that are shared with my lexer (flex)
%token <tokenData> ID
%token <tokenData> NUMCONST
在我的语法中,我使用
number : NUMCONST {std::cout<<"Line "<<$1-
我已经用flex和bison编写了一个解析器好几个星期了,但是由于双重递归而停止了,它的定义与前几条规则类似。Bison总是在特定的阶段选择错误的路径,并且因为语法不匹配而崩溃。野牛代码看起来有点像这样:
set :
TOKEN_ /* token */
QString
QString
Integer /* number of descrs (see below) */
M_op /*'M' optional*/
alts;
和
alts :
alt | alts alt ;
alt :
QString
pName_op /* empty | TO
如果我的一条规则与另一条规则的部分展开相同,我将如何标记优先级?例如,我有expression IS type规则,它应该递归地将type展开为type DOT identifier。但是,在同样的规则中,expression,我有expression DOT identifier,它将bison报告为冲突。显然,我希望as表达式类型部分中的所有DOT合并成type,而不是作为表达式。Ie:a is b.c.d应该解析为(a is b.c.d),其中b.c.d是type,而不是(a is b).c.d。下面是显示冲突的最小语法:
%require "3.0"
%defines
首先,我对flex和bison非常陌生,我似乎真的不能解决这个问题。
我已经创建了flex和bison文件,它的编译工作正常这里是我的flex和bison文件
(ps评论是法语的) Flex:
%{
// Définitions en language C
#include"minilang.tab.h"
extern int yylval;
extern int nbrligne;
%}
// les définitions des expressions régulières
/*
Définitions de la partie
我正在用bison编写解析器。我遇到了一个问题,bison检测到解析错误,但没有调用yyerror。
下面是我处理类定义的脚本片段:
%{ ...
void yyerror(char *s);
Program ast_root; /* the result of the parse */
Classes parse_results;
}%
...
%%
/*
Save the root of the abstract syntax tree in a global varia
我已经使用flex和bison编写了一个程序来解析文件。yylval由flex正确返回,当我尝试在我的野牛代码中打印$1值时,它也打印$2,$3。我怎么才能摆脱这个。我的flex和bison代码是附加的。
setuplog.l
%{
#include <stdio.h>
#include "setuplog.tab.h"
#include <string.h>
int yyline=1;
%}
time ([0-9]+\:[0-9]+\:[0-9]+\.[0-9]+)
date
因此,在大学开始我们的补习技术课程之前,我们有一个关于挠曲,野牛的教程。
下面的测试应该分为行和换行符。
testtest test data
second line in the data
another line without a trailing newline
这就是我的解析器应该输出的内容:
Line: testtest test data
NL
Line: second line in the data
NL
Line: another line without a trailing newline
当我跟着跑
cat test.txt | ./parser
这将返回:
LI
野牛抱怨“冲突:1个移位/减少”。我看不出出了什么问题。请帮帮忙。谢谢,
%token OR AND NUMBER
%%
search_condition:
| search_condition AND search_condition { printf(" AND "); }
| '(' search_condition ')'
| predicate
;
predicate:
NUMBER { printf(
我正在为一所大学的编译器主题练习写一个小编译器,当我试图编译我的程序时,它说:
In file included from lexer.l:2:
parser.y++:21: error: ISO C++ forbids declaration of ‘Expresion’ with no type
parser.y++:21: error: expected ‘;’ before ‘*’ token
make: *** [principal] Error 1
这里我给出了lexp.l文件中的第2行:
#include "parser.tab.h++"
和来自parser.y+
我有一个关于我用C编写的解析器的问题,它应该使用左递归(为操作符提供左结合性),然后返回后缀表示法的表达式。特别适用于我的Expr和Term规则。目前我遇到了一个问题,我认为这不会发生。下面是我的语法:
extern int yylex(); /* The next token function. */
extern char *yytext; /* The matched token text. */
extern int yyleng; /* The token text length. */
void yyerror(char *s);
#define YYSTYPE long /* 6
我正在实现的语言在两个操作符| * |和* || *之间存在冲突-第一个是“规范”操作符,其中两个|-characters包围了一个表达式,另一个是一个或操作符,其中两个表达式包含了两个|-characters。
到目前为止,我能够解析类似于||| a || b | | |的表达式--即围绕单个或(规范中有任意数量的范数和任何系列或操作符)的三层范数;这只有在表达式的尾部由彼此之间有空格的|-characters组成时才有效--也就是说,||| a || b | | |可以工作,但是||| a || b |||会导致语法错误。我希望能够将最后一个版本解析为包含a or b的三个规范。
我的实施