我正在为Rust中的数学语言编写一个解释器,用于解决数学表达式。
当 lexing 时,程序需要根据令牌中使用的字符知道它是什么类型的令牌(例如它是一个函数还是一个操作符)。
目前,我使用枚举来表示一种令牌:
pub enum IdentifierType {
Function,
Variable,
Operator,
Integer,
}
要检查令牌的类型,我使用一个函数,该函数将IdentifierType
作为输入,并根据输入进行匹配以返回bool
。在这种情况下可以使用的数据结构相对简单,因为令牌只有一个属性:允许的字符。
当解析到抽象语法树(AST)时,我想知道基于令牌使用了什么特定的运算符或函数,并且能够添加对该运算符的引用和它与AST的相关功能。
当解释时,我希望能够在节点上调用execute并让它知道如何执行自己的函数。
我试图想出一个存储所有这些相关项目的解决方案,但我遇到的并不令人满意。
例如,我将所有运算符存储在TOML文件(一种映射到哈希表的配置文件)中,但存储枚举(受约束的值)很困难,并且无法存储运算符函数。我还希望能够通过多个键进行搜索,例如运算符关联性(例如,获取所有正确关联的运算符),这意味着在源代码中存储不是很令人满意。
我所拥有的其他可能的想法是使用某种SQL混合系统,但这似乎很难实现