아래의 문법은 '작동합니다'. 그러나 작은주의가 지금은Bison 문법의 기초 계산기 문제
1.0-----------------2.0
같은 물건을 할 수 있으며이 둘 사이의 플립 플롭 것이다 -2는 1 개 연산 2 다음 평가합니다 할 때까지이있다. bison에 대한 새로운 지식과 이에 대한 수정을 구현하는 것이 가장 좋은 방법에 대해 명확하지 않습니다. 나는 3 가지 단위로 '+' '-'의 모든 조합에 오류를 제기하는 것을 염두에두고있다.하지만 그것은 8 가지 문법 규칙이며 나는 바이슨에 오류를 던지는 방법조차 모른다. 이렇게하는 것이 더 명확하고 이해하기 쉬운 방법이 있다고 생각합니다.
플렉스 렉서
%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;}
;
%%
나에게 올바른 행동입니다. 이것이 문제가 확실합니까? 방금 파이썬 2.7에서 당신의 표현을 시도해 보았습니다. –
문법에 따라 '올바른 동작', 실제로 ++ 또는 - 연산자가 아닌 경우입니다. 좀 더 복잡한 문법 규칙을 구현하는 방법을 알아보기위한 테스트와 같은 올바른 행동이 아닌 '올바른 행동'으로 만들고 싶습니다. 불행히도, 나의 새로운 점은이 간단한 작업조차도 성취하기가 어렵습니다. 나는 문법에 대해 합리성을 강요하고 싶습니다. 나는 실제로 렉서가 이것을하기 더 쉬울 수도 있다고 생각하기 시작했다. [+ -] {3} {return ERROR;}와 같은 것. – user2927848
어떻게 들소에 실제로 오류가 발생합니까? – user2927848