我想創建一個解析器 - 掃描儀將得到作爲輸入文件哪個文件有這樣的東西里面: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