构建可识别合法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
相关产品推荐
相关产品推荐

