我正在与 Tatsu 一起为半导体行业使用的语言实现解析器。该语言要求在使用前定义变量。例如:
SignalGroup { A: In; B: Out};
Pattern {
V {A=1, B=1 }
V {A=1, B=0 }
};
在这种情况下,SignalGroup 模块必须位于 Pattern 模块之前。在 TatSu 中编写语法时,我如何强制/实施这种“排序”?
我正在与 Tatsu 一起为半导体行业使用的语言实现解析器。该语言要求在使用前定义变量。例如:
SignalGroup { A: In; B: Out};
Pattern {
V {A=1, B=1 }
V {A=1, B=0 }
};
在这种情况下,SignalGroup 模块必须位于 Pattern 模块之前。在 TatSu 中编写语法时,我如何强制/实施这种“排序”?
尽管对于某些语言,可以编写语法来验证相同符号是否出现在不同的地方,但语法通常最终过于复杂而无用。
编译器(翻译器)通常使用单独的词法、句法和语义分析器组件来实现。有几个原因:
考虑到这些组件,检查符号是否先前定义属于程序的语义(意义)方面,检查的方法是保留一个符号表,当输入的定义部分被解析时, 并查询输入的使用部分正在被解析。
特别是在TatSu中,不同的组件被很好地分离,但并行运行。根据您的要求,您只需要使用允许存储和查询符号的语义操作的最简单的语法。通过从语义动作中引发FailedSemantics
,任何语义错误都将准确地报告为词汇和句法错误,因此用户不必考虑哪个组件标记了每个错误。
如果您在TatSu中使用 Python 解析器生成,翻译器将生成语义动作类的骨架作为输出的一部分。