【问题标题】:Symbol table and semantic analysis for compiler编译器的符号表和语义分析
【发布时间】:2011-06-15 13:40:09
【问题描述】:

我正在为类似 C 的语言(一种更简单的语言)构建编译器(不使用任何工具,如 lex 或 bison),并且已经通过了词法分析器和解析器。 我不确定我做解析器的方式是否正确。因为,到目前为止,要进行解析,即检查语法是否正确,我根本没有使用过链表。 基本上,我的解析器如下所示: 假设语法是 -

<program> ::= <program_header> <program_body>
<program_header>::= program <identifier> is
<program_body> ::= (<declaration>;)*
begin
(<statement>;)*
end program

我的程序如下所示:

parser()
{
char *next_token;
next_token = get_token();
check_for_program(next_token);
}
check_for_program(next_token)
{
check_for_program_header(next_token);
if (header_found)
check_for_program_body();
}...

我基本上有所有非终端的功能,并在适当的时候调用它们,我正在通过“strcmp”检查关键字。 这个方法可以吗?

从这里开始,如何进行语义分析?我应该从哪里开始构建符号表?

任何建议或思考的指针都很棒!非常感谢

【问题讨论】:

    标签: c compiler-construction semantic-analysis symbol-table


    【解决方案1】:

    一个常见且相当简单的方法是创建一个递归下降解析器,即创建与您的语法相对应的函数(您似乎已经开始这样做了):

    例如

    <program> ::= <program_header> <program_body>
    <program_header>::= program <identifier> is
    <program_body> ::= (<declaration>;)*
    

    将对应于类似的东西

    void program()
    {
      program_header();
      program_body();
    }
    
    void program_header() 
    {
       char* program_token = get_token();
       char* identifier = get_token();
       if (identifier==NULL) report_error();
       ...
    }
    
    void program_body()
    {
       declaration();
       ...
    }
    

    并在每个函数内部进行语义检查。您将需要一个符号表,如果您不想处理范围或拥有某种符号表堆栈,则它要么是一个全局结构。

    【讨论】:

      【解决方案2】:

      是的,这是一种解析方式,称为Recursive descent parser。这是一种非正式的解析方式,这意味着如果您更改语法,则需要更改解析代码。

      还有像LLSLR这样的形式解析方法,形式方法有两个优点:你可以证明解析解析了你的语法定义的东西(这就是它们被称为形式的原因),并且它们是通用的,您可以编写一次代码并解析任何兼容的语法。

      【讨论】:

        猜你喜欢
        • 2012-02-01
        • 2016-06-28
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 2012-03-30
        相关资源
        最近更新 更多