⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 编译原理中的First集与 Follow集生成程序
💻 TXT
字号:

Create First & Follow Set(CFF).
( First 与 Follow 集生成程序 )

作者:吕进华 (lvjinhua)
版本:V1.5
mail:nujinhua@163.com
修改日期:2005年3月27日

    这是我的一个防 Bison 1.24 扫描器自动生成器中的一部分,将它提取出来,以
方便大家在需要的时候使用。
    本程序可以从输入文件中读取类似于 Bison1.24 中定义的上下文无关文法并对其
进行处理,输出其终结符集、非终结符集、产生式(文法)集、First与Follow集。


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    [Copyright]你可以任意的使用、传播或修改本程序而无需特别的知会我,但我不会
对你使用本程序所造成的后果负任何责任。

    [简介]本程序是一个用于生成上下文无关文法FIRST集与FOLLOW集的工具,可从文件中
读取文法并对文法进行处理,输出其终结符、非终结符、产生式(文法)、First与Follow集。

    [用法]输入 “CFF 文件名” 即可将打开“文件名”,并可处理里边的文法文件内容.处理后
的内容将输出到“文件”.out.txt 中。如输入 “CFF a.txt” (注意,没有双引号)即开始处
理 a.txt 中的文法内容并输出结果存入到当前文件夹下的“a.txt.out.txt” 文件中。还可以
直接双击可执行文件,然后根据提示输入待处理的源文件文件名。

    [环境]本程序所附的源代码在使用Windows XP系统下使用VC7.1编译通过,在VC6.0不能
正确的产生可执行代码,在GCC3.2下也编译通过。由于条件有限,其它编译器没有进行测试。

    [反馈]如果你在使用本程序的过程中遇到了任何的BUG或有什么不明白的地方,欢迎与
我取得联系,谢谢您的支持。

    [最后修改日期]2005年4月2日。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *  CFF1.5 改动: executable code

 *  1) 可以对文法进行化简。
 *  2) 增加 '.' 作为标识符的一部分,其作用相当于下划线('_'),即现在
 *     a.ff 也可以是一个合法的标识符名称。
 *  3) 支持绝大部分的 Bison1.24 语法规则,如 %token,%left,%right,%prec...,
 *     注释,文法动作,嵌入式文法动作等。
 *  4) 程序结果输出到独立的文件中。
 *  5) 取消命令行参数。
 *  6) 为原始文法添加 “@start->开始符号” 的新产生式。
 *  7) 修改了一些小错误。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 文法文件语法简单说明:

    《注释》:本分析程序可以识别类似C++语言中  /* */ 及  // 风格的注释。
    其中  /* */ 代表从第一个 /* 到与其配对的下一个  */ 之间的内容均为注释,注释不
支持嵌套。
    其中  //  代表从  // 开始到本行结束为注释内容。


    本程序能够识别的文法文件的格式与 Bison 1.24 兼容(因此强烈建议有趣的朋友找一些
Bison 的相关文档看看),共分三大部分,每部分使用“%%”
进行分隔,分别为:

      预定义
      %%
      规则说明
      %%
      其它

    《其它》部分为可以包含任何内容,它不作为CFF语法的一部分,一般情况下可忽略,Bison 
中这部分用于定义一些C语言函数。


    《预定义》部分为记号声明部分,声明的记号用于代替一个终结符或非终结符,其书写规则
为:第一个字符必须为字母或下划线,后边可跟字母、数字或下划线,长度限制在56个字符以内,
各个记号之间使用空白进行分隔。
     1)“%token”关键字进行终结符的声明即可,而非终结符不需要进行声明。
     格式如下:
      %token 标识符1  标识符2  ... 标识符N
      %token 标识符1 , 标识符2 , ... , 标识符N
  
     声明了标识符后在“规则说明”部分即可以使用这些标识符所代表的终结符。

      2) “%start” 关键字用于声明开始符号。
      %start 标识符用于声明开始符号,如果没有使用此关键字,则默认使用第一个产生式的左
部作为方法开始符号。

      3)  其它关键字
      其它关键字如  “%left ,%right,%nonassoc,%type,%union”的使用同 Bison 相同,但在
本程序中它们均失去了本来的功能,比如 %left ,%right,%nonassoc 可以被 %token 代替,%type
定义可有可无。
      除了关键字,程序还支持  “%{ ... %}”的C语言语句声明格式。

      4)  建议
      由于本程序是主要是用于计算first集与follow集,因此Bison中那些复杂的规则也用处不大,
因此在预定义部分使用“%token”关键字即可满足要求,具体可以查看附带的示例“C99.txt”。


    《规则说明》部分对文法的产生式进行说明。可采用简单的写法,如:  expr:expr '+' term ;
即一次书写一个文法,文法左部与右部使用一个冒号(:)进行分隔,文法的结尾须加分号(;),如果文
法中使用了单个符号的终结符,可以使用单引号将其直接使用到产生式中。如果是多个符号的终结符必
须在“预定义”部分将其声明为一个标识符。
    文法也可以采用复合的写法,如:
    expr:
         expr '+' term
       | expr '-' term
       | term
       |
       ;
    上边的文法代表三个产生式,每个产生式的左部均为expr,右部使用“|”进行分隔,最后也需
使用分号标明文法结束。在这三个产生式中有一个为空产生式,即在“|”后直接跟分号,等价的格
式如下:
    expr:expr '+' term;
    expr:expr '-' term;
    expr:term;
    expr: ;
   
    也可以在“规则说明”的文法中插入“语义动作”,但它们对于计算first集与follow集没有实
际意义,因此在些不加以说明,有兴趣可以查看Bison的相关使用说明。



    程序输出结果的First集中的 $Null 代表空标记,Follow集中的 $Sharp 代表输入结束标记(即
有些编译原理书中的“#”或“$”号)。


    本程序所附带的测试文件 C99.txt 是一个标准C语言文法,gcc2.9.txt 是 Djgpp 编译器源程序中
自带的一个C++语言完整 Bison 语法描述文件,它综合展示了 Bison 中绝大部分功能的使用方法 , 
test.txt即附录1中的计算器文法文件。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
附录1 : 一个简单的计算器文法


%token ID NUM
%%
line:
    expr ';' line
   |
  ;
expr:
    expr '+' term
  | expr '-' term
  | term
  |
  ;
term:
    term '*' factor
  | term '/' factor
  | factor
  ;
factor:
    ID
  | NUM
  | '(' expr ')'
  ;



附录2:CFF 文法扫描程序文法(这个文法描述不是很精确,但源程序中就是使用这个文法
       实现的递归下降分析程序)

%token ID NUM ASC MARK PREC
  /* 关键字  */
%token START TOKEN UNION LCURL RCURL LEFT RIGHT NONASSOC TYPE

%%
spec  : defines MARK rules tail
   ;
  
tail  : MARK eat_up_rest
    | // empty 
;

defines: // empty
    |   START    ID                 defines
    |   UNION    eat_up_union       defines
    |   LCURL    eat_up_defs RCURL  defines
    |   TOKEN    symtype            nlist
    |   LEFT     symtype            nlist
    |   RIGHT    symtype            nlist
    |   NONASSOC symtype            nlist
    |   TYPE     symtype            nlist2
;

eat_up_defs:
      /* Call the function eat_up_def() to copy
         the C declare to output file.*/
    ;

eat_up_union:
      /* Call the function eat_up_union()to copy
         the union declear to output file.*/
    ;

eat_up_symtype:
      /* Call the function eat_up_symtype() to
         copy between '<' to '>' into symbol's
         symtype field.*/
    ;

eat_up_rest:
      /* Call function eat_up_rest() to copy the
         rest of the Grammar file into output file.
       */
    ;
     
symtype:  /* empty */
    |   '<' eat_up_symtype '>'
    ;

nlist : factor
    |   factor nlist
    |   factor ',' nlist
    ;
    
factor: ID
    |   ID NUM
    |   ASC
    |   ASC NUM
    ;

nlist2 : factor2
    |    factor2 nlist2
    |    factor2 ',' nlist2
    ;
factor2: ID
    |    ASC
    ;

rules : ID ':' rbodys ';' rules
    | /* empty */
    ;

rbodys: '|' rbody prec rbodys
    |   ID  rbody prec rbodys
    |   ASC rbody prec rbodys
    |   '{' rbody prec rbodys
    |   PREC      prec rbodys /* 处理由 %prec 指定优先级的空产生式.*/
    |   ';'                   /* 处理分号前边可能产生的空产生式*/
    ;

rbody : /* empty */
    |   ID  rbody
    |   ASC rbody
    |   '{' eat_act '}'           /* common action*/
    |   '{' eat_act '}' ID  rbody /* panel action */
    |   '{' eat_act '}' ASC rbody /* panel action */
    |   '{' eat_act '}' '{' rbody /* panel action */
    ;

prec  : /* empty */
    |   PREC ID
    |   PREC ID '{' eat_act '}'
    ;

eat_act: 
    // empty
    ;
    


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -