达: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 作为输出的一部分。
我正在与 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 作为输出的一部分。