我写了一个词法分析器和解析器来分析线性代数语句。每个语句由一个或多个表达式和一个或多个声明组成。我正在使用 menhir 和 OCaml 编写词法分析器和解析器。
例如:Ax = b,其中 A 是可逆的。
这应该读作 A * x = b, (A, invertible)
在表达式中,所有 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
有什么方法可以分隔各个字符并告诉解析器它们应该被视为乘法吗?有没有办法改变词法分析器,让它足够聪明地知道逗号之前的所有字符簇都是 ids 并且之后的所有簇都应该被视为字符串?