parsing - 句法分析和语义分析

标签 parsing syntax compiler-construction semantics recursive-descent

我想知道语法分析和语义分析是如何工作的。

我已经完成了我的解释器的词法分析器和语法构建。

现在我将为这个语法实现一个递归下降(自上而下)解析器

例如,我有以下语法:

<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/

相关文章:

python - 如何在 Python 中更改 None 的值?

php - 奇怪的数组语法

使用条件运算符声明数组元素的 Javascript 行为异常?

compiler-construction - lex 使用来自 lex.yy.c 文件的 flex -gettin 输出

python - 使用Python中的生成器深度优先遍历树

c - 转编译为另一种语言

java - Gson反序列化为JsonObject而不是某个对象

c++ - 哪个维基解析器?

java - 尝试让 ANTLR 语法遵循 AND/OR 语句

javascript - 如何使用 lxml 从文本区域获取 javascript 代码?