2016-12-21 4 views
0

Ich habe den folgenden Code auch mehr nach wie expr: int {} | BOOL {} etc, aber ich weiß nicht, was ist der Typ, den ich im Typ dieses Parser schreiben sollte, ich habe ein Taschenrechnerbeispiel, das mit int arbeitet und der Typ ist int, aber in meinem Programm habe ich float char string etc .. DankeIch versuche, einen Parser mit ocamlyacc für eine Sprache zu machen, aber welchen Typ sollte ich setzen?

%{ 
dont know what to write here 

%} 

%token <int> INT 
%token <float> FLOAT 
%token <char> CHAR 
%token <bool> BOOL 
%token <string> IDENT 
%token PLUS Div Bigger Smaller MINUS TIMES 
%token TYPE 
%token DEF DD 
%token Equals Atribuicao SoE BoE And Or 
%token IF ELSE BEGIN END WHILE RETURN PV SEQ TO BY OF 
%token RP LP LB RB 
%token EOL 
%left Bigger Smaller SoE BoE Equals Atribuicao Or And 
%left PLUS MINUS  
%left TIMES Div   
%nonassoc UMINUS OF 

%start main   

%type <> main /* what should be in here ? */ 


main: 
| expr EOL    { $1 } 
expr:   
    INT     { }  
| BOOL     { } 
| FLOAT     { } 
| CHAR     { } 
| expr OF expr    { } 
| BEGIN expr END   { } 
| RETURN expr PV   { $2 } 
| LP expr RP    { $2 } 
| LB expr RB    { $2 } 
| expr PLUS expr   { } 
| expr MINUS expr   { } 
| expr TIMES expr    { } 
%% 

let main() = begin 
Printf.printf "Hello yo\n" ; 

end;; 

Antwort

2

Geht man von der Grammatik, der Rückgabetyp sollte so etwas wie expression sein, weil es Ausdrücke, die Sie analysieren. Wie Sie diesen Typ definieren, hängt von der Semantik ab, die Sie implementieren möchten. Ich schätze, dass Sie einen Variantestyp benötigen, der mindestens Atome des Typs int, bool, float und char enthalten kann. So können Sie mit

type expression = 
| Int of int 
| Bool of bool 
| Float of float 
| Char of char 

beginnen und sehen, wo es Sie hinführt.

Verwandte Themen