logo
0
0
WeChat Login

文法分析器 (Grammar Analyzer)

一个完整的乔姆斯基文法分析工具,支持文法类型判定、合法性验证和统计信息。

功能特性

  1. 文法类型判定: 自动判断文法所属的乔姆斯基类型 (0-3型)

    • TYPE_3_RIGHT # 右线性正则文法
    • TYPE_3_LEFT # 左线性正则文法
    • TYPE_2 # 上下文无关文法(但不是正则文法)
    • TYPE_1 # 上下文相关文法
    • TYPE_0 # 无限制文法
    • INVALID # 文法不合法
  2. 文法合法性验证: 检测文法中的错误

    • UNDEFINED_SYMBOL: 产生式中引用了未在 N 或 T 中定义的符号
    • UNREACHABLE: 从开始符号无法到达的非终结符
    • NON_GENERATING: 无法推导出终结符串的非终结符
    • START_NOT_IN_N: 开始符号不在非终结符集合中
    • FORMAT_ERROR: 文件格式不符合规范
  3. 文法统计信息: 提供文法的详细统计数据

    • 非终结符数量
    • 终结符数量
    • 产生式数量
    • 是否包含ε产生式
    • 开始符号

项目结构

/workspace/
├── CMakeLists.txt          # CMake构建配置
├── examples/              # 示例文法文件
│   └── test.bnf          # 简单的BNF文法示例
├── include/               # 头文件
│   ├── grammar.h         # 文法类定义
│   ├── grammar_parser.h  # 文法解析器
│   ├── chomsky_classifier.h # 乔姆斯基分类器
│   └── validator.h       # 文法验证器
├── src/                  # 源文件
│   ├── main.cpp         # 主程序,命令行接口
│   ├── grammar.cpp      # 文法类实现
│   ├── grammar_parser.cpp # 文法解析器实现
│   ├── validator.cpp    # 文法验证器实现
│   └── chomsky_classifier.cpp # 乔姆斯基分类器实现
└── 测试文件/             # 测试用例
    ├── test_grammar1.bnf     # 基础2型文法测试
    ├── test_type3_right.bnf  # 3型右线性文法测试
    ├── test_type3_left.bnf   # 3型左线性文法测试
    ├── test_type1.bnf        # 1型文法测试
    ├── test_error.bnf        # 有错误的文法测试
    └── test_final.bnf        # 综合表达式文法测试

使用方式

命令行接口

# 文法类型判定
./grammar_analyzer input.txt --check-type

# 文法合法性验证  
./grammar_analyzer input.txt --validate

# 文法统计信息
./grammar_analyzer input.txt --stats

编译项目

cd /workspace
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

或者直接使用g++编译:

g++ -std=c++17 -I./include -o grammar_analyzer \
src/main.cpp src/grammar_parser.cpp src/grammar.cpp src/validator.cpp src/chomsky_classifier.cpp

输入格式

文法文件为纯文本文件(UTF-8 编码),格式如下:

# 非终结符集合(空格分隔)
N: S A B C
# 终结符集合(空格分隔)
T: a b c
# 产生式(每行一条,| 分隔同一左部的多个右部,ε 表示空串)
P:
S -> A B C
A -> a A | a
B -> b
C -> c C | ε
# 开始符号
START: S

技术实现

  1. 文法解析: 严格按照输入格式规范解析文法文件
  2. 符号分类: 区分非终结符和终结符,支持ε(epsilon)表示空串
  3. 产生式分析: 处理多个候选式,记录行号信息
  4. 可达性分析: 计算从开始符号可达的符号集合
  5. 生成性分析: 计算可以生成终结符串的符号集合
  6. 乔姆斯基分类: 按最严格类型原则进行自动分类

开发规范

  • 使用C++17标准
  • 严格的类型检查
  • 完整的错误处理
  • 模块化设计
  • 详细的注释文档

测试用例

项目包含完整的测试用例,覆盖:

  • 不同类型文法的分类测试
  • 各种错误类型的验证测试
  • 边界条件测试
  • S->ε例外规则测试

许可证

MIT License