2

我正在与 Tatsu 一起为半导体行业使用的语言实现解析器。该语言要求在使用前定义变量。例如:

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

在这种情况下,SignalGroup 模块必须位于 Pattern 模块之前。在 TatSu 中编写语法时,我如何强制/实施这种“排序”?

4

1 回答 1

2

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

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

  • 每个组件都非常集中,因此更清晰,更容易编写。
  • 每个组件都非常高效
  • 最常见的错误(完全是词汇、句法和语义)可以更早地报告

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

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

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

于 2019-11-09T12:58:27.523 回答