我已经编写了一个词法分析器和分析器来分析线性代数语句。每个语句由一个或多个表达式组成,后跟一个或多个声明。我使用menhir和OCaml来编写词法和解析器。使用menhir和OCaml重载乘法
例如: Ax = b,其中A是可逆的。
这应被理解为A * X = B,(A,可逆)
表达式中的所有的ID必须是一个大写或小写的符号。我想重载乘法运算符,以便用户不必输入'*'符号。但是,由于词法分析器也需要能够读取字符串(例如在本例中为“可逆”),因此表达式的“Ax”部分作为字符串发送到解析器。这会导致解析器错误,因为在语句的表达式部分中不应该遇到任何字符串。
这里是语法
stmt :=
| expr "."
| decl "."
| expr "," decl "."
expr :=
| term
| unop expr
| expr binop expr
term :=
| <int> num
| <char> id
| "(" expr ")"
decl :=
| id "is" kinds
kinds :=
| <string> kind
| kind "and" kinds
的基本思想是有一些方法来单个字符分开,并告诉他们应该被视为乘法解析器?有没有办法改变词法分析器,以便足够聪明地知道逗号前的所有字符集都是id,并且之后的所有集群都应该被视为字符串?
我的合作伙伴和我碰到的解决方案是在词法分析器中定义关键词,使它们不能成为大词汇的一部分。所以“in”中的“in”不会注册为关键字(因为它后面有一个字符)。有没有一个标准的方法来做到这一点? –