目标是确认一些c/cpp的语法细节,需要看cpp语法定义文件。
考虑从c的语法定义文件开始确认。
考虑实现一个简化的语言定义和编译器,为后续的实际需求做自定义扩展。
参考网页:
https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
中文参考:https://www.jianshu.com/p/15efcb0c06c8
C11 : ISO/IEC 9899:2011
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
6.4 Lexical elements 开始
EBNF定义: https://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf
EBNF图示定义:https://www.ics.uci.edu/~pattis/misc/ebnf2.pdf
每种语言都可能对标准BNF做了扩展,但基本都比较好理解。
BNF:Backus–Naur Form 巴科斯-诺尔范式,无确切规范
EBNF: Extended BNF 扩展的,无标准
ABNF :augmented BNF 增强型,适合解析,不适合阅读
典型的元语言BNF,用来描述语法的一种形式体系。
::= 被定义为,EBNF中为=
"" 引号中的字符本身,EBNF中也支持单引号''
double_quote "引号用double_quote转义
| 或
, 串接,中间无任何字符
; EBNF中为终止,类似c语言
<> 必选项
[] 可选,EBNF中单个?也表示可选
{} 重复
() 分组,优先级,类似c语言
...:表示各种列举或省略的代码片断;示例:a...z
"..." 表示 由 双引号 " 包围起来的任意字符
(*...*):注释,EBNF
?...?:特殊序列,EBNF
-:排除,除去,EBNF
ISO/IEC 14977 标准给出的ENBF符号表,共12种符号
=,;|[]{}()“”‘’??-
https://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf
用 EBNF范式 来描述 EBNF 的语法
生成式 = 生成式名 '=' [ 表达式 ] [';'] ;
表达式 = 选择项 { '|' 选择项 } ;
选择项 = 条目 { 条目 } ;
条目 = 生成式名 | 标记 [ '…' 标记 ] | 分组 | 可选项 | 重复项 ;
分组 = '(' 表达式 ')' ;
可选项 = '[' 表达式 ']' ;
重复项 = '{' 表达式 '}' ;
用EBNF描述xml,基于chatgpt。可能并不准确,只是示例。
完整的在https://www.w3.org/TR/2004/REC-xml-20040204/#sec-notation
Document ::= Prolog Element
Prolog ::= '<?xml' Version Encoding? '?>'
Version ::= 'version' Eq ("'1.0'" | "'1.1'")
Encoding ::= 'encoding' Eq ('"' EncName '"' | "'" EncName "'")
Eq ::= '='
Element ::= '<' Name AttrList? '>' Content '</' Name '>'
AttrList ::= Attribute+
Attribute ::= Name Eq ('"' Value '"' | "'" Value "'")
Content ::= (Element | Data)*
Data ::= (characters not including '<' or '&')
Name ::= (Letter | '_') (NameChar)*
NameChar ::= Letter | Digit | '.' | '-' | '_' | ':'
Letter ::= [A-Za-z]
Digit ::= [0-9]
EncName ::= [A-Za-z] [A-Za-z0-9._-]*
BNF变体列表:http://www.cs.man.ac.uk/~pjj/bnf/ebnf.html
其中,C语言为Intermediate风格BNF变体。
Intermediate BNF说明:https://www.cl.cam.ac.uk/~mgk25/iso-14977-paper.pdf
C语言语法定义的字体说明:
C语言语法示例: