为我的解析器编译以下规则时遇到问题:
%%
表达式:
| expr ASN expr { Asn ($1, $2) }
这是一个赋值规则,它接受一个整数,然后是赋值(等号)和一个表达式,如我的 AST 中所定义:
type expr = Asn of int * expr
当然,编译器会抱怨,因为我正在定义“ expr ASN expr”,第一个参数应该是整数,而不是表达式。但是,我无法弄清楚指定这一点的语法。
如果有人能引导我朝着正确的方向前进,我将不胜感激。
谢谢!
你没有提供足够的细节来给出一个好的答案。你说的整数是什么意思?我假设你的意思是一个整数文字。
假设你的词法定义有一个名为 INT 的标记,它代表一个整数文字,你可能想要这样的东西。
expr:
| INT ASN expr { Asn ($1, $2) }
可能你想要的任务是:
type expr = Asn of var * int
然后在解析器中定义 expr 为:
expr:
| VAR ASN INT { Asn ($1, $2) }
在词法分析器中,您应该将 VAR 定义为字符串,并将 INT 定义为整数文字,就像示例一样:
| [a-zA-z]+ { VAR($1) }
| [0-9]+ as i { INT(int_of_string i) }