PDA

Visualizza la versione completa : [C] Errore sintattico o semantico?


The_Mad_Hatter
21-08-2009, 10:54
Sono alle prese con un progetto per il quale mi serve scrivere un parser per un linguaggio c-like e, notando che nella grammatica risultante ci sono più incasinamenti di quanto pensassi, mi sono chiesto se non mi stessi complicando un po' troppo la vita facendo confusione tra sintassi e semantica.
Esempio chiave: puntatori, nella fattispecie operatori dereferencing e address-of.

*p, questo è il caso più semplice, ma tra i tanti altri ci sarebbero (ricordate che a me serve solo che il tipo di scrittura sia CORRETTO, l'uso che ne deriva poco importa) *&p (equivalente a p), **p (a patto che la variabile puntata da p sia un puntatore), *++*p++, ++*++*++p, **++&*(p++), e così via........

Per l'address-of è già più semplice la questione, può essere usato solo su qualcosa che ha un indirizzo di memoria quindi ovviamente &&var, &!var, &5 sono tutti esempi sbagliati.

Ma ciò che io mi chiedo a questo punto è:

Non sono forse &5, *5, *!var e via di seguito da considerarsi errori SEMANTICI più che sintattici?
Questo giustificherebbe molte cose...



Modifico per fare un altro esempio:
In rete si trova questa grammatica del c: http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
Ok, a occhio sembra accettare tutte le istruzioni del c, il problema è però che ne accetta troppe! Ad esempio, cito questo pezzo per capire:

primary_expression
: IDENTIFIER
| CONSTANT
| STRING_LITERAL
| '(' expression ')'
;

postfix_expression
: primary_expression
| postfix_expression '[' expression ']'
| postfix_expression '(' ')'
| postfix_expression '(' argument_expression_list ')'
| postfix_expression '.' IDENTIFIER
| postfix_expression PTR_OP IDENTIFIER
| postfix_expression INC_OP
| postfix_expression DEC_OP
;

argument_expression_list
: assignment_expression
| argument_expression_list ',' assignment_expression
;

unary_expression
: postfix_expression
| INC_OP unary_expression
| DEC_OP unary_expression
| unary_operator cast_expression
| SIZEOF unary_expression
| SIZEOF '(' type_name ')'
;

Questo rende chiaramente legittima una scrittura del tipo ++var++, oppure ++ ++ var che invece è chiaramente errata. Anche questo errore semantico? Il fatto è che a me sembra proprio un errore sintattico, invece...

Loading