我想创建一个解析器 - 扫描仪将得到作为输入文件哪个文件有这样的东西里面:5 + 23 + ..... + 3;
,我希望它打印结果屏幕上。解析器和扫描仪为x1 + x2 + ... + xn
我觉得有点难以理解$$ = $1 +...
的工作方式,以及这些$1
,$2
与令牌是如何连接的。如果有人能向我解释那部分,我会非常感激。
我的代码到目前为止是这样的:
法代码:
%option noyywrap
%%
\+ //{ yylval.p = yytext[0]; return PLUS; }
; //{ yylval.q = yytext[0]; return Q_MARK; }
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) { yylval.d = atof(yytext); return NUMBER; }
%%
Flex代码:
%defines
%{
#include <stdio.h>
#include <stdlib.h>
%}
%union {
double d;
}
%token <d> NUMBER //some number
%token PLUS // +
%token Q_MARK // ;
%start addition_list
%%
addition_list : addition Q_MARK {}
| addition_list addition Q_MARK {}
;
addition : NUMBER PLUS NUMBER { }
| addition PLUS NUMBER { }
;
%%
int yyerror(char *message)
{
return 0;
}
void main()
{
yyparse();
}
PS:我已经在它应该如何看一些指令所以这就是为什么它是像那样。无论你能给我什么线索都会非常感激,因为我发现它很难理解互联网指南(尽管如此)。
非常感谢您的回答...把它作为指导,我会尝试一些事情。如果你想回答的话,还有两个简单的问题。例如:NUMBER PLUS NUMBER printf工程,但是当我把这个{$$ = $ 1 + $ 3;}解析器抛出错误(我想做这样的事情来得到结果)。第二,除了声明终端(例如%token NUMBER)我是否还必须声明非终端来实现我的目标? –
这里是一个flex和野牛计算器的例子。试着复制这个例子,并找出它的工作原理。如果你仍然有问题,你可以再问我一次:-) http://www.usna.edu/Users/cs/lmcdowel/courses/si413/F10/labs/L04/calc1/ex1.html – Amazonasmann
对于你的语法规则,你需要做这样的事情:%type addition_list addition –
Amazonasmann