0

我有下面的代码也有更多类似 expr: int {} | BOOL {} 等,但我不知道我应该在这个解析器的类型中写什么类型,我有一个适用于 int 且类型为 int 的计算器示例,但在我的程序中我有 float char string 等。谢谢

  %{
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;;
4

1 回答 1

2

从您的语法来看,返回类型应该类似于expression,因为它是您解析的表达式。如何定义该类型取决于您要实现的语义。我想您将需要一个至少可以容纳 , 和 类型的原子的int变体bool类型。所以你可以从floatchar

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

看看它会把你带到哪里。

于 2016-12-21T08:53:25.953 回答