首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >句法分析与语义分析

句法分析与语义分析
EN

Stack Overflow用户
提问于 2013-09-29 06:35:14
回答 2查看 3.3K关注 0票数 5

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

我已经完成了我的翻译的词汇和语法结构。

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

例如,我有以下语法:

代码语言:javascript
运行
复制
<declaration>  ::=   <data_type> <identifier> ASSIGN <value>

因此,我编写了如下代码(在java中):

代码语言:javascript
运行
复制
public void declaration(){
    data_type();
    identifier();
    if(token.equals("ASSIGN")){
        lexer();   //calls next token
        value();
    } else {
        error();
    }
}

假设我有三种数据类型: Int、String和Boolean。因为每种数据类型的值是不同的,(例如。只有在布尔值中为true或false )如何确定它是否适合数据类型?我的代码的哪一部分会决定这一点?

我想知道我该把密码写在什么地方:

代码语言:javascript
运行
复制
1.) call the semantic analysis part of my program. 
2.) store my variables into the symbol table.

语法分析和语义分析同时进行吗?还是我需要先完成语法分析,然后再进行语义分析?

我真的很困惑。请帮帮忙。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-02 18:38:58

可以同时进行语法分析(解析)和语义分析(例如,检查<data_type><value>之间的一致性)。例如,当声明()调用data_type()时,后者可以返回指示声明的类型是Int、String还是布尔值的东西(称为DT)。类似地,value()可以返回指示解析对象的类型的东西(VT)。然后,声明()将简单地比较DT和VT,如果它们不匹配,则会引发错误。(或者,value()可以接受一个指示声明类型的参数,it可以执行检查。)

但是,您可能会发现完全分离这两个阶段比较容易。为此,您通常需要在解析阶段构建一个解析树(或抽象语法树)。所以你的高层会打电话给你(例如)program()解析整个程序,返回表示(程序语法)的树,然后将该树传递给semantic_analysis()例程,该例程将遍历树,提取相关信息并强制执行语义约束。

票数 3
EN

Stack Overflow用户

发布于 2017-10-27 05:27:12

简单的回答是:--它取决于编程语言的定义。而且,由于您只指定了一个派生规则和三个本机类型,因此无法知道。例如,如果编程语言允许像下面的c++代码那样进行前向声明,那么处理函数声明(foo)的派生规则(Foo)是,而不知道变量序列的类型。

代码语言:javascript
运行
复制
class Tree {
public:
    int foo(void)
    {
        return serial;
    }
    int serial;
};

事实上,现代编译器将语法分析阶段与语义分析阶段分开。首先执行语法分析阶段,确保输入程序与语言的上下文无关文法一致。此外,还生成了一个Abstract Syntax Tree (AST)。注意AST和解析树之间的区别,如in this SO post所讨论的那样。然后,语义分析阶段遍历AST并检查类型不匹配等。

尽管如此,玩具编程语言有时可以将语义和语法分析结合在一起。使用递归下降解析器时,应该有相关的递归调用返回类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19075189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档