2

我正在为类似 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”检查关键字。这种方法好吗?

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

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

4

2 回答 2

3

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

例如

<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();
   ...
}

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

于 2011-01-26T00:02:45.833 回答
0

是的,这是一种解析方式,它被称为递归下降解析器。这是一种非正式的解析方式,这意味着如果您更改语法,则需要更改解析代码。

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

于 2011-01-26T00:05:14.957 回答