我想知道语法分析和语义分析是如何工作的。
我已经完成了我的解释器的词法分析器和语法构建。
现在我将为这个语法实现一个递归下降(自上而下)解析器
例如,我有以下语法:
<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。由于每种数据类型的值不同(例如仅 bool 值中的 true 或 false),我如何确定它是否正确适合数据类型?我的代码的哪一部分将决定这一点?
我想知道我应该把代码放在哪里:
1.) call the semantic analysis part of my program.
2.) store my variables into the symbol table.
语法分析和语义分析是同时进行的吗? 还是需要先完成语法分析,然后再进行语义分析?
我真的很困惑。请帮忙。
谢谢。
最佳答案
您可以同时进行语法分析(解析)和语义分析(例如,检查 <data_type>
和 <value>
之间的一致性)。例如,当declaration()调用data_type()时,后者可以返回一些东西(称之为DT),指示声明的类型是Int、String还是Boolean。类似地,value() 可以返回指示解析类型的内容 (VT)。然后declaration()将简单地比较DT和VT,如果它们不匹配则引发错误。 (或者,value() 可以采用指示声明类型的参数,并且它可以进行检查。)
但是,您可能会发现完全分离两相更容易。为此,您通常需要让解析阶段构建一个解析树(或抽象语法树)。因此,您的顶层将调用(例如)program()来解析整个程序,这将返回表示程序(的语法)的树,并且您将将该树传递给semantic_analysis()例程,该例程将遍历该树,提取相关信息并实现语义约束。
关于parsing - 句法分析和语义分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19075189/