达:Rue Ordering

Tatsu: Rule Ordering

我正在与 Tatsu 合作,为半导体行业中使用的语言实现解析器。这种语言要求在使用前定义变量。例如:

SignalGroup { A: In; B: Out};
Pattern {
   V {A=1, B=1 }
   V {A=1, B=0 }
};

在这种情况下,SignalGroup 块必须Pattern 块之前。在 TatSu 中写语法时,我如何 enforce/implement 这个 "ordering"?

虽然对于某些语言来说,可以编写语法来验证相同符号是否出现在不同的地方,但语法通常最终会变得过于复杂而无用。

编译器(翻译器)通常使用单独的词法、句法和语义分析器组件来实现。有几个原因:

  • 每个组件都非常集中,写起来更清晰、更容易。
  • 每个组件都非常高效
  • 可以更早地报告最常见的错误(确切地说是词法、句法和语义错误)

考虑到这些组件,检查一个符号是否已经被预先定义属于程序的语义(意义)方面,检查的方法是保留一个符号table,当正在解析输入的 定义 部分,正在解析输入的 使用 部分的查询。

特别是在 TatSu 中,不同的组件分离得很好,但 运行 是并行的。根据您的要求,您只需要使用允许 semantic actions 存储和查询符号的最简单语法。通过从语义操作中引发 FailedSemantics,任何语义错误都将与词汇和句法错误完全相同,因此用户不必考虑哪个组件标记了每个错误。

如果您在 TatSu 中使用 Python 解析器生成,翻译器将生成语义动作的框架 class 作为输出的一部分。