求C语言文法及产生式!要做C编译器——语法分析部分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C语言文法及产生式!要做C编译器——语法分析部分相关的知识,希望对你有一定的参考价值。

我要完整的产生式文法,因为要写C语言的编译器;否则只能自己琢磨了
重金奖赏真正能提供帮助的人,谢谢

紧急!!!!

呵呵,是啊。现在表达式的基本上写出来了,但是其他没有一本编译原理的书介绍的,百度也照不到,郁闷了...

参考技术A 转自http://blog.csdn.net/rill_zhen/article/details/7701259http://blog.csdn.net/rill_zhen/article/details/7701259
希望能帮到你

编译原理-1-C语言的文法
  编译原理-1-C语言的文法
  c语言的文法产生式:
  program ->
  external_declaration
  | program external_declaration
  external_declaration ->
  function_definition
  | declaration
  function_definition -> type_specifier declarator compound_statement
  type_specifier ->
  VOID
  | CHAR
  | INT
  | FLOAT
  declarator
  pointer direct_declarator
  | direct_declarator
  Pointer->
  '*'
  | '*' pointer
  direct_declarator
  IDENTIFIER
  |direct_declarator’[‘ ‘]’
  |direct_declarator ’[’ constant_expression ’]’
  | IDENTIFIER '(' parameter_list ')'
  | IDENTIFIER '(' ')'
  |direct_declarator‘,’identifier_list
  identifier_list
  : IDENTIFIER
  | identifier_list ',' IDENTIFIER
  constant_expression->
  conditional_expression
  parameter_list ->
  parameter_declaration
  | parameter_list ',' parameter_declaration
  
parameter_declaration ->
  declaration_specifiers IDENTIFIER
compound_statement ->
  '' ''
  | '' statement_list ''
  | '' declaration_list statement_list ''
  declaration_list ->
  declaration
  | declaration_list declaration
  Declaration->
  init_declarator
  | init_declarator_list ',' init_declarator
  init_declarator ->
  declarator
  | declarator '=' initializer
  Initializer ->
  assignment_expression
  | '' initializer_list ''
  | '' initializer_list ',' ''
  initializer_list ->
  initializer
  | initializer_list ',' initializer
  statement_list->
  statement
  | statement_list statement
  Statement ->
  | compound_statement
  | expression_statement
  | selection_statement
  | iteration_statement
  | jump_statement
  expression_statement ->
  ';'
  | expression ';'
  selection_statement
  : IF '(' expression ')' statement
  | IF '(' expression ')' statement ELSE statement
  iteration_statement->
  WHILE '(' expression ')' statement
  | FOR '(' expression_statement expression_statement ')' statement
  | FOR '(' expression_statement expression_statement expression ')' statement
  jump_statement
  | CONTINUE ';'
  | BREAK ';'
  | RETURN ';'
  | RETURN expression ';'
  expression
  : assignment_expression
  | expression ',' assignment_expression
  assignment_expression ->
  conditional_expression
  | unary_expression assignment_operator assignment_expression
  conditional_expression ->
  logical_or_expression
  | logical_or_expression ' ' expression ':' conditional_expression
  logical_or_expression ->
  logical_and_expression
  | logical_or_expression OR_OP logical_and_expression
  logical_and_expression
  : inclusive_or_expression
  | logical_and_expression AND_OP inclusive_or_expression
  inclusive_or_expression->
  exclusive_or_expression
  | inclusive_or_expression '|' exclusive_or_expression
  exclusive_or_expression
  : and_expression
  | exclusive_or_expression '^' and_expression
  and_expression
  : equality_expression
  | and_expression '&' equality_expression
  equality_expression
  : relational_expression
  | equality_expression EQ_OP relational_expression
  | equality_expression NE_OP relational_expression
  relational_expression
  : shift_expression
  | relational_expression '$amp;
  | relational_expression '$amp;>apos;$ shift_expression
  | relational_expression LE_OP shift_expression
  | relational_expression GE_OP shift_expression
  shift_expression
  : additive_expression
  | shift_expression LEFT_OP additive_expression
  | shift_expression RIGHT_OP additive_expression
  additive_expression
  : multiplicative_expression
  | additive_expression '+' multiplicative_expression
  | additive_expression '-' multiplicative_expression
  multiplicative_expression
  : cast_expression
  | multiplicative_expression '*' cast_expression
  | multiplicative_expression '/' cast_expression
  | multiplicative_expression '%' cast_expression
  cast_expression
  : unary_expression
  | '(' type_name ')' cast_expression
  unary_expression
  : postfix_expression
  | INC_OP unary_expression
  | DEC_OP unary_expression
  | unary_operator cast_expression
  | SIZEOF unary_expression
  | SIZEOF '(' type_name ')'
  postfix_expression ->
  : primary_expression
  | postfix_expression '[' expression ']'
  | postfix_expression '(' ')'
  | postfix_expression '(' argument_expression_list ')'
  | postfix_expression '.' IDENTIFIER
  | postfix_expression PTR_OP IDENTIFIER
  | postfix_expression INC_OP
  | postfix_expression DEC_OP
  primary_expression ->
  IDENTIFIER
  | CONSTANT
  | STRING_LITERAL
  | '(' expression ')'
  argument_expression_list
  : assignment_expression
  | argument_expression_list ',' assignment_expression
  unary_operator
  : '&'
  | '*'
  | '+'
  | '-'
  | '~'
  | '!'
  assignment_operator ->
  '='
  | MUL_ASSIGN
  | DIV_ASSIGN
  | MOD_ASSIGN
  | ADD_ASSIGN
  | SUB_ASSIGN
  | LEFT_ASSIGN
  | RIGHT_ASSIGN
  | AND_ASSIGN
  | XOR_ASSIGN
  | OR_ASSIGN
  storage_class_specifier ->
  TYPEDEF
  | EXTERN
  | STATIC
  | AUTO
  | REGISTER
  struct_or_union_specifier
  : struct_or_union IDENTIFIER '' struct_declaration_list ''
  | struct_or_union '' struct_declaration_list ''
  | struct_or_union IDENTIFIER
  struct_or_union
  : STRUCT
  | UNION
  struct_declaration_list
  : struct_declaration
  | struct_declaration_list struct_declaration
  struct_declaration
  : specifier_qualifier_list struct_declarator_list ';'
  specifier_qualifier_list ->
  type_specifier specifier_qualifier_list
  | type_specifier
  | type_qualifier specifier_qualifier_list
  | type_qualifier
  struct_declarator_list ->
  struct_declarator
  | struct_declarator_list ',' struct_declarator
  struct_declarator ->
  : declarator
  | ':' constant_expression
  | declarator ':' constant_expression
  enum_specifier ->
  ENUM '' enumerator_list ''
  | ENUM IDENTIFIER '' enumerator_list ''
  | ENUM IDENTIFIER
  enumerator_list ->
  enumerator
  | enumerator_list ',' enumerator
  Enumerator ->
  IDENTIFIER
  | IDENTIFIER '=' constant_expression
  type_qualifier ->
  CONST
  | VOLATILE
  type_qualifier_list ->
  type_qualifier
  | type_qualifier_list type_qualifier
  parameter_type_list ->
  parameter_list
  | parameter_list ',' ELLIPSIS
  parameter_list ->
  : parameter_declaration
  | parameter_list ',' parameter_declaration
  type_name ->
  specifier_qualifier_list
  | specifier_qualifier_list abstract_declarator
  abstract_declarator ->
  pointer
  | direct_abstract_declarator
  | pointer direct_abstract_declarator
  direct_abstract_declarator ->
  '(' abstract_declarator ')'
  | '[' ']'
  | '[' constant_expression ']'
  | direct_abstract_declarator '[' ']'
  | direct_abstract_declarator '[' constant_expression ']'
  | '(' ')'
  | '(' parameter_type_list ')'
  | direct_abstract_declarator '(' ')'
  | direct_abstract_declarator '(' parameter_type_list ')'
  labeled_statement ->
  IDENTIFIER ':' statement
  | CASE constant_expression ':' statement
  | DEFAULT ':' statement
参考技术B pascal的好找。。我也在找c的。。。 参考技术C 自己给自己加油吧 我编译原理学得不怎么样 楼主写这个是爱好吧,相信写出来之后能提高不少

编译原理之文法和语言总结与梳理

前言

  一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具。语法只是定义什么样的符号序列是合法的,与这此符导的含义落无关系,比如对于个Pascal程序来说,一个上下文无关文法可以定义符号串A:一B+C是一个合乎语法的默值语句,而A:=B+就不是。但是,如果B是实型的,而C是布尔理的,或者B、C中任何一个变量没有事先说明,则A:=B+C仍不是正确的程序,也就是说程序结构上的这种特点—类型匹配、变量作用域等是无法用上下文无关手段检查的,这些工作属于语义分析工作。程序设计语言的语义常常分为两类:静态语义和动态语义。静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的;动悉语又也称作运行语义或执行语义,表明程序要做些什么,要计算什么。

  阐明语法的一个工具是文法,这是形式语言理论的基本概念之一。本章将介绍文法和语言的概念,重点讨论上下文无关文法及其句型分析中的有关问题。

  阐明语义要比阐明语法困难得多,尽管形式语义学的研究已取得重大进展,但是仍没有哪一种公认的形式系统可用来自动构造出正确的编译系统。本书不对形式语义学进行介绍。

 

文法的直观概念

  在给出文法和语言的形式定义之前,先直观地认识一下文法的概念。

  当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷多个句子的语言来讲,存在着如何给出它的有穷表示的问题。

  以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,如“我是大学生”是汉语的一个句子。汉语句子可以由主部后随请活而成,构成谓语的是动词和直接宾话,采用EBNF来表示这种句子的构成规则:

<句子>::=<主语><谓语>

<主语>::=<代词> | <名词>

<代词>::=我 | 你 | 他

<谓语>::=<动词><直接宾语>

<动词>::=是 | 学习

<直接宾语>::=<代词><名词>

 

符号和符号串

  正如英语是由句子组成的集合,而句子又是由单词和标点符号组成的序列那样,程序设计语言Pascal或C语言是由一切Pascal程序或C程序所组成的集合,而程序是由类似i、begin、end的符号以及字母和数字这样一些基本符号所组成,从字面上看,每个程序都是一个“基本符号”串,假设有一个基本符号集,那么Pascal或C语言可看成是在这个基本符号集上定义的、按一定规则构成的一切基本符号串组成的集合。为了给出语言的形式定义,首先讨论符号和符号串的有关概念。

 

文法和语言的形式

  规则,也称重写规则产生式生成式,是形如a→b或a::=b的(a,b)有序对,其中。称为规则的左部,β称作规则的右部。这里使用的符号→(::=)读作“定义为”。例如A→a读作“A定义为a”。也把它说成是一条关于A的规则(产生式)。

 

文法的类型

  自从乔姆斯基(Chomsky)于1956年建立形式语言的描述以来,形式语言的理论发展很快。这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。

  乔姆斯基把文法分成4种类型,即0(文法)1(上下文有关的)2(上下文无关的)3(正规文法)。这几类文法的差别在于对产生式施加不同的限制。

       定义 令G是一个文法,S是文法的开始符号,abo的是文法G的一个句型。如果有S-*→aAo且(A-+→b测标b是句型abo相对于非终结符A的短语。特别地,如果有(A→β是句型abo相对于规则A→b的直接短语(也称简单短语)。一个右句型的直接短语称为该句型的句柄。句柄的概念只适合于右句型。

 

句型的分析

  对于上下文无关文法,语法树是句型推导过程的几何表示。语法树确实将所给句型的结构很直观地显示出来了。语法树是句型结构分析的极好工具。而这里所说的句型分析问题,是说如何知道所给定的符号串是文法的句型。句型的分析就早识别一个符号串是否为某文法的句型,是某个推导的构造过程。进一步说,当给定一个符号串时,试图按照某文法的规则为该符号串构造推导或语法树,以此识别出它是该文法的一个句型;当符号串全部由终结符号组成时,就是识别它是不是某文法的句子。因此也有人把语法树称为语法分析树分析树。对于程序设计语言来说,要识别的是程序设计语言的程序,程序是定义程序设计语言的文法的句子。句型分析是一个识别输入符号串是否为语法十正确的程序的过程。在语言的编译实现中,把完成句型分析的程序称为分析程序识别程序,分析算法又称识别算法。

以上是关于求C语言文法及产生式!要做C编译器——语法分析部分的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-LL1文法详细讲解

编译原理follow集与first集的计算

c语言的文法产生式

编译原理 - 语法分析: 自上而下的语法分析

C语言实现NFA转DFA

C++/编译原理语法分析:求解First集合