我有一种用任意Ardic谓词描述域的语言。 例如,在一阶逻辑中,我可以编写以下规则:
PersonlivesInCountry(x,y) <-> person(x), PersonlivesInState(x,z), StateisInCountry(z,y)
在此示例中,PersonLivesInCountry中的所有配对都完全符合其他限制。这里的关键点是表达其他限制之间的 join ,例如与PersonLivesInState和StateIsInCountry谓词相同的z。 用我的语言,我一直都有这种结构,因此我需要编写语法来表达此连接条件。 是否可以确保关系的每个退出索引都与后继者在(内部)联接中?
答案 0 :(得分:1)
上下文无关的语法不能表达名称一致(除非可能的名称集是有限的,即使那样也很痛苦)。
这种分析通常属于“语义分析”类别,通常在(一系列)遍历抽象语法树(AST)时更容易编写。在该模型中,解析器仅构建AST。
对于简单的解析器,可以在解析过程中通过将语义动作附加到每个语法规则来进行语义分析。但是,这通常会导致代码分解不良,从长远来看,很难维护和修改这些代码。
也就是说,看到语义动作不仅用于构建AST,而且还用于符号表并不少见。我不像以前那样喜欢它。这些天来,我将解析器中的符号分析限制为在插入符号表中输入符号,这简化了内存管理并加快了语义分析期间的符号查找。 YMMV。项目进展顺利。