BisonFlexEmscripten テスト (Ajax Version)
Bison/Flex/C ファイルのアップロード
file name:
%{ /* C 宣言部 ─ 動作記述の中で用いる関数の定義や宣言 */ #define YYSTYPE double /* トークンの属性の型を宣言 */ #include
#include
/* exit 関数を使うため */ void yyerror(char* s) { printf("%s\n", s); } int yylex(void); /* yylex のプロトタイプ宣言 */ %} %token NUMBER %token FOO /* tokenの優先順位 */ %left '+' '-' FOO %left '*' '/' %% input : /* 空 */ | input line {} ; line : '\n' { printf("end\n"); exit (0); } /* 空行だったら終了 */ | expr '\n' { printf("\t%g\n", $1); } ; expr : NUMBER { $$ = $1; } | expr FOO expr { $$ = $1 * 256 + $3; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } ; %% int main(void) { printf("空行で終了します。\n"); yyparse(); return 0; }
file name:
%option yylineno %{ void yyerror(char*); #define YY_SKIP_YYWRAP #define YYSTYPE double /* トークンの属性の型を宣言 */ int yywrap() { return 1; } #include "parser.h" /* parser.h は bison が生成するファイル */ %} %option always-interactive %% [ \t]+ { /* ここでは何もしない */ } [0-9]+(\.[0-9]+)?(E[+\-]?[0-9]+)? { /* NUMBER というトークンを返す。その値(``属性'')は yylval という大域変数に代入する。 */ sscanf(yytext, "%lf", &yylval); return NUMBER; } [+\-*/()=\n] { /* + - * / ( ) = \n の場合は、マッチした文字をそのまま返す。*/ /* マッチした文字は一般に yytext[0] 〜 yytext[yyleng-1]。*/ return yytext[0]; } "*+" { /* 複数のルールにマッチする場合は,長い方が優先される */ return FOO; } . { yyerror("不正な文字です。"); return '\n'; } %% /* なにもなし */
Input:
1 + 2 * (3 + 4)
result ↓↓↓: