编程语言/语法规范
描述语言有两种方式:通过其语法或语义。语言的语法是一组规则,定义了哪些字符串(句子或语句)属于该语言;语言的语义描述了给定语句的含义。
对于一种语言,可以将一个语句分解成一系列词素,即语言的不可分解的构建块。例如,以下w:Perl语句
do { sleep 1; } while (++$i < 10);
包含词素:do
, {
, sleep
, 1
, ;
, }
, while
, (
, ++
, $i
, <
, 10
, )
和 ;
。
词素可以被分组到不同的类别中。这样的类别被称为记号。
- 巴科斯范式(BNF)
- 算术文法
- 一元否定 (~)
- 使用指数等复杂公式的语法树
扩展巴科斯范式旨在成为一种精确的方法来指定语言的语法。它是一种元语言,因为它是一种用于描述语言的语言。它也常见于命令用法或帮助文档中。
关于 EBNF 的完整文档可以在以下位置找到:[1].
语言的基本元素将使用 EBNF 终结符来描述,然后将这些终结符组合成逻辑上的更高层次的表达式,使用非终结符来表示整个语言。终结符指定实际有效的字符模式,用于表示诸如语言中变量名的正确语法或表示数字之类的内容。非终结符将给定事物的不同可能表示形式(例如,十进制、十六进制或科学记数法格式的数字常量)分组到单个逻辑事物 ([Numerical_Constant]) 中。最终,通过构建各种语法元素并表达它们组合的方式,最终得到一个符号来表示所讨论语言中的程序。
awk 实用程序的手册页中可以找到一些示例。
(摘自 [2])
首先,它的用法
- awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
方括号中的项是 EBNF 的一个示例,表示 awk 命令行上可选的参数。
其次,用法详细部分部分用 EBNF 指定。
在下面的示例中,诸如 'pattern'、'action'、'expression' 和 'statement' 之类的词是 EBNF 非终结符。
模式-动作语句具有以下形式
pattern { action }
缺少 { action } 表示打印该行;缺少模式始终匹配。模式-动作语句由换行符或分号分隔。
动作是一系列语句。语句可以是以下之一
if( expression ) statement [ else statement ] while( expression ) statement for( expression ; expression ; expression ) statement for( var in array ) statement do statement while( expression ) break continue { [ statement ... ] } expression # commonly var = expression print [ expression-list ] [ > expression ] printf format [ , expression-list ] [ > expression ] return [ expression ] next # skip remaining patterns on this input line nextfile # skip rest of this file, open next, start at top delete array[ expression ]# delete an array element delete array # delete all elements of array exit [ expression ] # exit immediately; status is expression
语句由分号、换行符或右大括号终止。
整个语言也可以用 EBNF 文档化。下面的链接记录了 ANSI 定义的 C++,该文档的许多部分都是用 EBNF 编写的。