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