我想问一下关于概念的一些想法:Domain Object
和Semantic Model
。
所以,我真的很想了解什么是Domain Object / Semantic Model
,什么不是Domain Object / Semantic Model
。
据我所知,在给定grammar
的情况下,做这些分离概念是绝对可取的。
然而,我不太清楚如何做到这一点。例如,给定这个轻微的语法,你如何构建Domain Object
或Semantic Model
。
这正是我想弄清楚的。。。
大多数书籍都建议采用这种方法来进行AST。你不需要同时直接翻译,而是通过AST创建一个语义模型,然后通过解释器连接到它。
示例(SQL语法树):
我没有直接生成SQL语句,而是创建了一个语义模型,然后我就可以连接一个解释器,将这个语义模型翻译成SQL语句。
Abstract Systex Tree -> Semantic Model -> Interpreter
通过这种方式,我可以拥有一个Transact-SQL解释器和另一个用于SqLite的onr。
术语"域对象"one_answers"语义模型"并不是编译器文献中真正的标准术语,因此您会得到很多随机答案。
与解析相关的常用术语有"具体语法树"(与语法规则的形状相匹配)、"抽象语法树"
解析只是处理语言问题的一小部分。你需要对语法进行大量的语义解释,无论你如何表示它(AST、CST…)
- 名称解析(对于每个标识符,在哪里定义?使用
- 类型解析(对于每个标识符/表达式/语法构造,该实体的类型是什么
- 类型检查(该语法构造是否以有效的方式使用?)
- 控制流分析(程序部分的执行顺序是什么,甚至可能是并行/动态/约束确定的)
- 数据流分析(值在哪里定义?消耗?)
- 优化(用另一个语义等价的集合替换一组语法结构,该集合具有一些不错的属性[编译后执行速度更快是常见的]),在高或低抽象级别
- 高级代码生成,例如,将语言中的句法结构集解释为目标[通常是汇编语言]语言中的等效集
这些概念中的每一个都或多或少地建立在前面的概念之上。
最接近"语义模型"的是高级代码生成。这需要在树上建造大量的机器。
ANTLR解析。你必须做/提供其余的。