抽象语法:编译器的核心技术解析
1. 语义动作
编译器的功能不仅仅是识别句子是否符合语法规则,还需要对这些句子进行有意义的处理。语义动作就是实现这一功能的关键,它可以对解析出的短语进行有用的操作。
1.1 语义值类型
每个终结符和非终结符都可以关联自己类型的语义值。例如,在使用特定语法的简单计算器中, exp 和 INT 关联的类型可能是 int ,而其他标记可能不需要携带值。标记关联的类型必须与词法分析器返回的类型相匹配。
1.2 递归下降解析器中的语义动作
在递归下降解析器中,语义动作可以是解析函数返回的值,也可以是这些函数的副作用,或者两者兼而有之。以下是一个递归下降解析器的示例代码:
enum token {EOF, ID, NUM, PLUS, MINUS,
· · · };
union tokenval {string id; int num;
· · ·
};
enum token tok;
union tokenval tokval;
int lookup(String id) {
· · ·
}
int F_follow[] = { PLUS, TIMES, RPAREN, EOF, -1 };
int F(void) {
switch (tok) {
case ID:
{int i=lookup(tokval.id); advance(); return i;}
ca
超级会员免费看
订阅专栏 解锁全文
2036

被折叠的 条评论
为什么被折叠?



