Legend Since 1984
Cruising between Fantasy and Reality...

Tuesday, June 13, 2006

A Customized and Simplified C-like Grammar

研究了一下C的文法后发现,要全部实现C的功能简直是难如登天。但是,做一个类C的简易的编译器还是相当可行的。

参考了C语言的完整文法后,花了一下午时候拟出了一个化简后的文法方案。简单的从文法上来看,可以做到和不能做到的:

  • 支持多个函数平行定义,不支持函数的递归定义;
  • 支持函数调用;
  • 支持数组定义和使用;
  • 支持多维数组,采用C的方式而非Pascal的方式;
  • 不支持指针类型;
  • 不支持结构体、公用体和枚举类型;
  • 暂不支持位运算;
  • 暂不支持逻辑运算、关系运算;
  • 暂不支持+=等运算符;(添加将会非常简单)
  • 暂不支持打括号内定义变量的作用域局限——即同一函数内的变量作用域相同;
  • 不支持字符串;(一大缺陷)
  • 两字节运算符支持有限;(受限于简陋的词法分析器)
  • 暂不支持浮点数;(受限于简陋的词法分析器)

尽管有这么多不支持的东西,但是我认为现在最重要的工作是处理函数调用的翻译方案,解决好函数调用,后面的工作才有基础展开。而解决函数调用最主要的工作是重新设计符号表,因为要解决变量作用域的问题就应该为不同的函数建立不同的符号表,同时,如果组织并存放这些符号表也将是一个值得考虑的问题。

完整的文法规则如下:

Start->Program
Program->Program External_definition
Program->External_definition

External_definition->Function_definition
External_definition->Variable_definition

Function_definition->Type_specifier Function_declarator { Statement_list }

Type_specifier->void
Type_specifier->int
Type_specifier->float

Function_declarator->IDENTIFIER ( )
Function_declarator->IDENTIFIER ( Parameter_list )

Parameter_list->Parameter_list , Parameter_definition
Parameter_list->Parameter_definition

Parameter_definition->Type_specifier IDENTIFIER

Variable_definition->Type_specifier ID_list ;

ID_list->ID_list , Variable_declarator
ID_list->Variable_declarator

Variable_declarator->IDENTIFIER
Variable_declarator->Variable_declarator [ CONSTANT ]

Statement_list->Statement_list Mark Statement
Statement_list->Statement

Statement->{ Statement_list }
Statement->Variable_definition
Statement->return Expression ;
Statement->continue ;
Statement->break ;
Statement->;
Statement->Left_value = Expression ;
Statement->while ( Mark Boolean ) Statement
Statement->If_Else_Condition Statement
If_Condition->if ( Boolean )
If_Else_Condition->If_Condition Statement else

Mark->epsilon

Left_value->IDENTIFIER
Left_value->Left_value [ Expression ]

Boolean->Boolean Mark H
Boolean->H

H->H & Mark G
H->G

G->! ( Boolean )
G->( Boolean )
G->true
G->false
G->Expression Rop Expression

Rop-><><= Rop->>
Rop->>=
Rop->==
Rop-><>

Expression->Expression + Term
Expression->Expression - Term
Expression->Term

Term->Term * Factor
Term->Term / Factor
Term->Factor

Factor->( Expression )
Factor->CONSTANT
Factor->Left_value
Factor->Function_caller

Function_caller->IDENTIFIER ( )
Function_caller->IDENTIFIER ( Argument_list )

Argument_list->Argument_list , Expression
Argument_list->Expression

Labels:

0 Comments:

Post a Comment

<< Home