You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建可识别合法C关键字组合的BNF文法技术需求

设计C关键字组合的BNF文法

给定C关键字集合:int, char, long, float, double, signed, unsigned, short, const, volatile,我们需要设计BNF文法,允许任意顺序的合法关键字组合,同时拒绝重复、冲突或无效的组合。

核心约束

在设计文法前,先明确C语言中这些关键字的组合规则:

  • 核心类型(int, char, float, double)必须且只能出现一个
  • 符号修饰符(signed, unsigned)互斥,最多出现一个,且仅能与整数核心类型(int, char)搭配
  • 长度修饰符(short, long)最多出现一个,仅能与int搭配
  • 限定符(const, volatile)可任意组合(每个最多出现一次),能与所有核心类型搭配
  • 所有关键字不能重复出现

BNF文法定义

以下BNF严格遵循上述约束,允许合法的关键字顺序排列:

<type-specifier> ::= <integer-type> | <floating-type>

// 整数类型规则
<integer-type> ::= <int-variant> | <char-variant>

<int-variant> ::= <int-components> int | int <int-components> | <int-part> int <int-part>
<int-components> ::= ε | <sign-mod> | <length-mod> | <qualifiers> | <sign-mod> <length-mod> | <sign-mod> <qualifiers> | <length-mod> <qualifiers> | <sign-mod> <length-mod> <qualifiers> | <sign-mod> <qualifiers> <length-mod> | <length-mod> <sign-mod> <qualifiers> | <length-mod> <qualifiers> <sign-mod> | <qualifiers> <sign-mod> <length-mod> | <qualifiers> <length-mod> <sign-mod>
<int-part> ::= <sign-mod> | <length-mod> | <qualifiers>

<char-variant> ::= <char-components> char | char <char-components> | <char-part> char <char-part>
<char-components> ::= ε | <sign-mod> | <qualifiers> | <sign-mod> <qualifiers> | <qualifiers> <sign-mod>
<char-part> ::= <sign-mod> | <qualifiers>

// 浮点类型规则
<floating-type> ::= <float-components> float | float <float-components> | <float-part> float <float-part> | <float-components> double | double <float-components> | <float-part> double <float-part>
<float-components> ::= ε | <qualifiers>
<float-part> ::= const | volatile

// 通用修饰符定义
<sign-mod> ::= signed | unsigned
<length-mod> ::= short | long
<qualifiers> ::= ε | const | volatile | const volatile | volatile const

示例验证

合法组合

  • volatile unsigned long int → 匹配<int-variant>:包含volatile(限定符)、unsigned(符号修饰)、long(长度修饰)和int(核心类型)
  • long unsigned volatile int → 匹配<int-variant>:关键字顺序调整仍符合规则
  • signed const char → 匹配<char-variant>:包含signed(符号修饰)、const(限定符)和char(核心类型)
  • const double → 匹配<floating-type>:包含const(限定符)和double(核心类型)

非法组合

  • unsigned signed short long → 错误:同时出现互斥的unsigned和signed,且缺少核心类型
  • short char → 错误:short(长度修饰)不能与char搭配
  • unsigned float → 错误:unsigned(符号修饰)不能与float搭配
  • int int → 错误:核心类型重复出现

内容的提问来源于stack exchange,提问作者anru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:27:06