所以我的語法低於'有效'。然而,它具有體積小告誡我現在可以做的東西一樣基本計算器的野牛語法問題
1.0-----------------2.0
,它會翻轉2之間翻牌-2直到它到達1個OP 2,然後將評估。對野牛來說還是一個新的問題,並且不清楚如何最好地爲此實施解決方案。我有一個想法,提出一個錯誤'+'''的增量爲3,但是這是8個語法規則,我甚至不知道如何拋出一個錯誤的野牛。我想有一個更清晰易懂的方法來做到這一點。
的Flex詞法
%option nounistd
%option noyywrap
%{
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include "parser.tab.h"
#define isatty _isatty
#define fileno _fileno
%}
%%
[ \t]+
\n {return '\n';}
[0-9]+(\.[0-9]+)? {yylval.number=atof(yytext); return NUMBER;}
. {return yytext[0];}
%%
野牛語法
%{
#include <stdio.h>
#include <math.h>
extern int yylex(void);
int yyerror(const char* c) { printf("%s\n",c); return 0;}
%}
%union
{
double number;
}
%type <number> exp
%token <number> NUMBER
%left '+' '-'
%left '*' '/'
%right '^'
%start commands
%%
commands
: /*empty*/
| commands line
;
line
: '\n'
| exp '\n' {printf("=%f\n",$1);}
| error '\n' {printf("encountered an error!\n");}
;
exp
: NUMBER { $$ = $1;}
| exp '+' exp {$$ = $1 + $3;}
| exp '-' exp {$$ = $1 - $3;}
| exp '*' exp {$$ = $1 * $3;}
| exp '/' exp {$$ = $1/$3;}
| exp '^' exp {$$ = pow($1,$3);}
| '-' exp {$$ = -$2;}
| '+' exp {$$ = $2;}
| '(' exp ')' {$$ = $2;}
;
%%
似乎這樣對我來說是正確的行爲。你確定這是一個問題嗎?例如,我剛剛在Python 2.7中嘗試過您的表達式,並且它的行爲方式相同。 –
根據語法,它是'正確的行爲',事實上,如果它不是++或 - 操作符。我想讓它成爲'不正確的行爲',只是作爲測試來看看如何實現稍微複雜的語法規則。不幸的是,我的新鮮事使得這個簡單的任務很難完成。我想強化語法的合理性。我實際上開始認爲詞法分析器可能更容易做到這一點。例如[+ - ] {3} {return ERROR;}。 – user2927848
你怎麼真的提出野牛的錯誤? – user2927848