文法 分析 2

pro

gram à

       external_declaration

      | program external_declaration

程序-> <外部声明><程序><外部声明>

 

 

external_declaration à

      function_definition

      | declaration

      外部声明-> <函数定义>|<声明>

 

function_definition à type_specifier declarator compound_statement

函数定义-> <函数类型><说明符><复合语句>

 

type_specifier à

      VOID

      | CHAR

      | INT

      | FLOAT

函数类型-> 无返回值|字符型|整型|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

选择语句-> IF(<表达式>)<陈述语句>|IF(<表达式>)<陈述语句>ELSE<陈述语句>

 

iteration_statementà

       WHILE '(' expression ')' statement

      | FOR '(' expression_statement expression_statement ')' statement

      | FOR '(' expression_statement expression_statement expression ')' statement

循环语句->WHILE(<表达式>)<陈述语句>|FOR(<表达式语句><表达式语句>)<陈述语句>|FOR(<表达式语句><表达式语句><陈述语句>)<陈述语句>

 

jump_statement

      | CONTINUE ';'

      | BREAK ';'

      | RETURN ';'

      | RETURN expression ';'

转移语句->CONTINUE;| BREAK; | RETURN; | RETURN <表达式>;

 

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

包括或表达式à<唯一或表达式>|<包括或表达式><唯一或表达式>

转载于:https://www.cnblogs.com/wsstzxwx/p/5089270.html

第三次上机—语法分析1 目的:熟练掌握自上而下的语法分析方法,并能用C++程序实现。 要求: 1. 使用的文法如下: E ® TE ¢ E ¢ ® + TE ¢ | e T ® FT ¢ T ¢ ® * FT ¢ | e F ® (E) | id 2. 对于任意给定的输入串(词法记号流)进行语法分析,递归下降方法和非递归预测分析方法可以任选其一来实现。 3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。可以参考书上介绍的同步记号集合来处理。 可能的出错情况:idid*id, id**id, (id+id, +id*+id …… 4. 输入串以#结尾,输出推导过程中使用到的产生式。例如: 输入:id+id*id# 输出:E ® TE ¢ T ® FT ¢ F ® id E ¢ ® + TE ¢ T ® FT ¢ …… 如果输入串有错误,则在输出中要体现是跳过输入串的某些记号了,还是弹栈,弹出某个非终结符或者是终结符了,同时给出相应的出错提示信息。比如: idid*id对应的出错信息是:“输入串跳过记号id,用户多输入了一个id”; id**id对应的出错信息是:“弹栈,弹出非终结符F,用户少输入了一个id” (id+id对应的出错信息是:“弹栈,弹出终结符 ) ,用户少输入了一个右括号(或者说,括号不匹配)” 有余力的同学可进一步考虑如下扩展: 1. 将递归下降方法和非递归预测分析方法都实现 2. 在语法分析的过程中调用第二次上机的结果,即利用词法分析器来返回一个记号给语法分析器。 3. 编写First和Follow函数,实现其求解过程。 测试文法: A->BCDE B->aBA|ε C->F|ε D->b|c|ε E->e|ε F->d|ε
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值