Originariamente inviato da edriv
Credo di avere capito che il + viene interpretato come un operatore binario mentre il - è unario.
E' una soluzione che non genera mai errori/ambiguità?
x := 4-2 lo metterebbe in crisi?
No perchè viene creato un nodo T_MINUS (T_MINUS = token '-')
con 2 nodi figli
codice:
simple_expression
: term { $$ = $1; }
/* crea un nodo con 2 figli */
| simple_expression addop term { $$ = make_opr_node($2, 2, $1, $3); }
;
addop
: T_PLUS { $$ = T_PLUS; }
| T_MINUS { $$ = T_MINUS; }
;
factor /* crea un nodo unario, con 1 solo figlio */
: sign factor { $$ = make_opr_node($1, 1, $2); }
...
;
sign
: T_PLUS { $$ = T_PLUS; }
| T_MINUS { $$ = T_MINUS; }
;
codice:
program test1;
var x: integer;
begin
x := 4-2
end.
l'albero generato è questo
codice:
Syntax tree
-----------
opr: T_ASSIGNMENT
1-id: 'x', declared: true
1-opr: T_MINUS
2-value: 4
2-value: 2
T_MINUS ha 2 nodi
genera
codice:
pushINT 4
pushINT 2
sub
pop x
assegna il risultato di 4-2=2 a x
E poi in algebra sarebbe legale anche scrivere:
+3
+3 * +5
-4 + 4 - 5
questo argomento è molto interessante...
ti consiglio questa pagina
http://www.epaperpress.com/lexandyacc/
http://www.epaperpress.com/lexandyac...ad/lexyacc.pdf
LEX è un tool per realizzare l'analizzatore lessicale (detto anche "lexer" e genera i token a partire dal codice sorgente)
YACC serve per generare il parser, cioè quel modulo che si occupa di costruire l'albero sintattico (parser) a partire dai token ottenuti dall'analizzatore lessicale (lexer)
qui invece c'è la grammatica per realizzare un compilatore Pascal
http://www.moorecad.com/standardpascal/yacclex.html
questo genera il lexer tramite LEX
http://www.moorecad.com/standardpascal/pascal.l
questo invece il parser tramite YACC
http://www.moorecad.com/standardpascal/pascal.y