类C语言语法分析:词法分析程序设计与实现

1. 词法元素概述

  • 关键字: 类C语言中包含20个关键字,如下表所示:

| 序号 | 关键字 | 序号 | 关键字 | |---|---|---|---| | 1 | 'begin' | 11 | 'exit' | | 2 | 'do' | 12 | 'if' | | 3 | 'while' | 13 | 'else' | | 4 | 'for' | 14 | 'select' | | 5 | 'int' | 15 | 'case' | | 6 | 'string' | 16 | 'break' | | 7 | 'double' | 17 | 'return' | | 8 | 'bool' | 18 | 'end' | | 9 | 'char' | 19 | 'write' | | 10 | 'float' | 20 | 'read' |

  • 运算符: 类C语言中包含以下运算符:

| 序号 | 运算符 | 序号 | 运算符 | |---|---|---|---| | 21 | '+' | 36 | '!' | | 22 | '-' | 37 | '&&' | | 23 | '*' | 38 | '||' | | 24 | '/' | 39 | '++' | | 25 | '**' (乘方) | 40 | '--' | | 26 | '%' (求余) | 41 | ',' | | 27 | '=' (赋值) | 42 | '-' (负号) | | 28 | '+=' | 43 | '&' | | 29 | '-=' | 44 | '%' (格式运算符) | | 30 | '==' | | | 31 | '<>' | | | 32 | '>' | | | 33 | '>=' | | | 34 | '<' | | | 35 | '<=' | |

  • 分界符: 类C语言中包含以下分界符:

| 序号 | 分界符 | 序号 | 分界符 | |---|---|---|---| | 45 | '(' | 48 | ';' | | 46 | ')' | 49 | '"' | | 47 | ',' | 50 | ''' |

  • 标识符: 标识符用于命名变量、函数、常量等。标识符的构词规则如下:

以大写字母(A-Z)或小写字母(a-z)开头,后面可以跟大写字母或小写字母或数字(0-9)或下划线。如果有下划线,只能出现一次,长度最多为15个。区分大小写。

  • 常量: 常量在程序运行过程中其值不能改变。类C语言中的常量分为以下类型:

    • 整型常量:包括十进制、八进制和十六进制。
    • 实型常量:包括十进制和科学计数法。
    • 字符型常量:单个字符,用单引号括起来。
    • 字符串型常量:多个字符,用双引号括起来。
    • 布尔型常量:只有两个值,分别是TRUE和FALSE。

2. 词法分析程序设计

  • 正规文法:

    • 关键字:
    keyword -> 'begin' | 'do' | 'while' | 'for' | 'int' | 'string' | 'double' | 'bool' | 'char' | 'float' | 'exit' | 'if' | 'else' | 'select' | 'case' | 'break' | 'return' | 'end' | 'write' | 'read'
    
    • 标识符:
    identifier -> (letter | '_') (letter | digit | '_')*
    
    • 常量:
    constant -> integer | real | character | string | boolean
    
    • 整型常量:
    integer -> decimal | octal | hexadecimal
    decimal -> digit+
    octal -> '0' octal-digits
    octal-digits -> '0' | octal-digits (digit '0'-'7')
    hexadecimal -> '0x' hex-digits
    hex-digits -> hex-digit | hex-digits (hex-digit)
    hex-digit -> digit | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
    
    • 实型常量:
    real -> decimal-point | decimal-point digits | digits decimal-point digits | scientific-notation
    decimal-point -> '.'
    digits -> digit+
    scientific-notation -> (digits | digits decimal-point) ('e' | 'E') ('+' | '-') digits
    
    • 字符型常量:
    character -> ''' (letter | digit | special-symbol) '''
    
    • 字符串型常量:
    string -> '"' (letter | digit | special-symbol | escape-sequence)* '"'
    
    • 布尔型常量:
    boolean -> TRUE | FALSE
    
  • NFA和DFA:

    NFA和DFA的图示略。

  • 整体方案设计:

    • 数据结构选择:使用符号表存储标识符和关键字,使用列表存储输入源程序和输出结果。符号表采用哈希表结构,以提高查找效率。
    • 符号表大小设置:根据预计的标识符和关键字数量设置合适的大小。
    • 输入源程序和输出结果存储:输入源程序存储在一个字符串中,输出结果存储在一个列表中。
    • 标识符和关键字的区分识别:在词法分析中,遇到标识符时,先在符号表中查找,若存在则为关键字,否则为标识符。
    • 两个字符组成的运算符的识别:通过查看下一个字符来判断是两个字符组成的运算符还是单个字符的运算符。
    • 负号和减号的区分:通过查看前一个字符来判断是负号还是减号。
    • 单词拼写错误的实现:通过比较识别的单词和关键字列表,若不在列表中则为拼写错误。

3. 代码实现:

  • 识别关键字和标识符:

    keywords = ['begin', 'do', 'while', 'for', 'int', 'string', 'double', 'bool', 'char', 'float', 'exit', 'if', 'else', 'select', 'case', 'break', 'return', 'end', 'write', 'read']
    
    def is_keyword(word):
        return word in keywords
    
    def is_identifier(word):
        if word[0].isalpha() or word[0] == '_':
            for char in word[1:]:
                if not (char.isalpha() or char.isdigit() or char == '_'):
                    return False
            return True
        return False
    
  • 识别整型和实型常量:

    def is_integer(word):
        try:
            int(word, 0)
            return True
        except ValueError:
            return False
    
    def is_real(word):
        try:
            float(word)
            return True
        except ValueError:
            return False
    

4. 测试用例:

int f(int a, double b)
begin 
  bool c = TRUE;
  char d;
  float e;
  string f;
  read('%f', &e);
  d = '345';
  while(a <= e)
    begin
      b = a ** 2 + b / 3;
      select(c)
      case f = 'a'; break;
      case e = -4.3 + 3.52e12.3 + 0x123 - 0123;
      case a += 8; 
      case c = 5 <> 9;
    end
  write('%f%d', e, a);
END

5. 运行结果截图:

运行结果截图略。

6. 输出结果说明:

| 单词类别 | 序号 | 例子 | |---|---|---| | 关键字 | 1-20 | 'begin', 'do', 'while', 'for', 'int', 'string', 'double', 'bool', 'char', 'float', 'exit', 'if', 'else', 'select', 'case', 'break', 'return', 'end', 'write', 'read' | | 运算符 | 21-44 | '+', '-', '*', '/', '**', '%', '=', '+=', '-=', '==', '<>', '>', '>=', '<', '<=', '!', '&&', '||', '++', '--', ',', '-', '&', '%' | | 分界符 | 45-50 | '(', ')', ',', ';', '"', ''' | | 标识符 | 51 | 'f', 'a', 'b', 'c', 'd', 'e' | | 整型常量 | 52 | 2, 0123, 0x123 | | 实型常量 | 53 | 4.3, 3.52e12.3 | | 字符型常量 | 54 | '345' | | 字符串型常量 | 55 | 'a' | | 布尔型常量 | 56 | TRUE, FALSE |

7. 总结

本文详细介绍了类C语言语法中的词法分析程序设计与实现方案,并提供了具体的代码示例和测试用例。通过学习本文,读者可以了解词法分析的原理和实现方法,并能够独立设计和实现词法分析程序。

类C语言语法分析:词法分析程序设计与实现

原文地址: https://www.cveoy.top/t/topic/paCc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录