我想知道语法分析和语义分析是如何工作的。
我已经完成了我的翻译的词汇和语法结构。
现在,我将为这个语法实现一个递归下降(自上而下)解析器。
例如,我有以下语法:
<declaration> ::= <data_type> <identifier> ASSIGN <value>
因此,我编写了如下代码(在java中):
public void declaration(){
data_type();
identifier();
if(token.equals("ASSIGN")){
lexer(); //calls next token
value();
} else {
error();
}
}
假设我有三种数据类型: Int、String和Boolean。因为每种数据类型的值是不同的,(例如。只有在布尔值中为true或false )如何确定它是否适合数据类型?我的代码的哪一部分会决定这一点?
我想知道我该把密码写在什么地方:
1.) call the semantic analysis part of my program.
2.) store my variables into the symbol table.
语法分析和语义分析同时进行吗?还是我需要先完成语法分析,然后再进行语义分析?
我真的很困惑。请帮帮忙。
谢谢。
发布于 2013-10-02 18:38:58
可以同时进行语法分析(解析)和语义分析(例如,检查<data_type>
和<value>
之间的一致性)。例如,当声明()调用data_type()时,后者可以返回指示声明的类型是Int、String还是布尔值的东西(称为DT)。类似地,value()可以返回指示解析对象的类型的东西(VT)。然后,声明()将简单地比较DT和VT,如果它们不匹配,则会引发错误。(或者,value()可以接受一个指示声明类型的参数,it可以执行检查。)
但是,您可能会发现完全分离这两个阶段比较容易。为此,您通常需要在解析阶段构建一个解析树(或抽象语法树)。所以你的高层会打电话给你(例如)program()解析整个程序,返回表示(程序语法)的树,然后将该树传递给semantic_analysis()例程,该例程将遍历树,提取相关信息并强制执行语义约束。
发布于 2017-10-27 05:27:12
简单的回答是:--它取决于编程语言的定义。而且,由于您只指定了一个派生规则和三个本机类型,因此无法知道。例如,如果编程语言允许像下面的c++代码那样进行前向声明,那么处理函数声明(foo)的派生规则(Foo)是,而不知道变量序列的类型。
class Tree {
public:
int foo(void)
{
return serial;
}
int serial;
};
事实上,现代编译器将语法分析阶段与语义分析阶段分开。首先执行语法分析阶段,确保输入程序与语言的上下文无关文法一致。此外,还生成了一个Abstract Syntax Tree (AST)。注意AST和解析树之间的区别,如in this SO post所讨论的那样。然后,语义分析阶段遍历AST并检查类型不匹配等。
尽管如此,玩具编程语言有时可以将语义和语法分析结合在一起。使用递归下降解析器时,应该有相关的递归调用返回类型。
https://stackoverflow.com/questions/19075189
复制相似问题