呵呵,雕欄玉砌應猶在
今天是偉大祖國第七十二個國慶,就不吟什麼
“異域風光不敢看”了,饒了你們這幫
“七癆八傷腎虛膝軟的撈鬆孬種”一日吧。
今天想起一件比較後悔的事,就是當年上學時沒問問
Kim(人名)教授:
“出於什麼動機我們要從CFG中去除右邊為空的生成規則 P→ε ”。雖然現在覺得自己想明白了,但沒有辦法印證我的想法是對的,網上也查不到答案,
沒人提出這個問題。也許他們認為這個
自然的,自古以來就是
然的。哪位同學懂,請說說你的答案使我確定一下我想得對吧。
說件在華南工學院的糗事:記得當年學
“帕撕卡語言”時,課本上將指針的符號印成
“↑”。當時華南工學院計算機系都
沒計算機,計算機系純
“紙上談‘機’”,好不容易才有機會能摸一下
“蘋果二”,找遍鍵盤都沒找到
“↑”,當時想死的心都有。記得老師不知從哪裡搞了個
“蘋果二”上的
“帕撕卡語言編譯器”兩張360K的五吋軟盤在
驅動器上
換來換去才可以。我就沒辦法將這個所謂
“編譯器”運行起來。華南工學院對我們
挺刻薄的,
兩張軟盤還要自己出錢買。還
貴得要死,10幾塊錢人民幣一張,真不知老師有沒有在我們身上
刮肉。反正當時我們窮得要死。軟盤是雙面的,但
“蘋果二”上的
驅動器卻是單面的。所以老師還給我們出個主意,在另一邊也剪一個缺口以便將軟盤翻過來塞進
驅動器也不會禁止寫(五吋軟盤與三吋軟盤不一樣,缺口封上表示
“寫保護”)。這樣整個操作就
更複雜了。像我這樣的天才就根本搞不過來。操,什麼世道!中國科學院在華南工學院一角存有一台帶六十個終端
“霍尼威爾DPS8”中型機,是在中美
“蜜月期”美國指使
“世界銀行”給的
“無息貸款”買的。但我們根本沒機會摸。記得在剛將機器裝好時確曾給我們玩了幾下讓他們試機,其實當時我們根本不會玩。還
騙我們花了好幾塊錢買了個他們翻譯的
《操作手冊》(
比《高等數學》的課本貴)。完全是
冤枉錢因為
後來“霍尼威爾DPS8”中型機就不給我們用了。黑啊。後來到了學
《數據結構》時,又給我們幾個小時的機時(當時的操作系統會在你從Login就開始計時,時間用完就得另買時間,不給錢就不給用了。不但用CPU要收錢,用內存用磁盤空間都收費。打印也要收錢)。一個程序都沒走起來時間就用完了,畢竟幾年都沒摸過計算機,手生得很,幾個小時的時光在膀胱都還沒來得及裝滿一泡尿前就蹓走,完了。還有就是進門還要換拖鞋,
我真懷疑我的香港腳就是那時染上的。最好笑的是那些
“專家”(操作員?)還故作神秘地說
“換拖鞋已經是管得鬆了。兄弟我在米國受訓時,入門還要‘吹風’吹掉身上的灰塵”。我當時心想沒叫你沐浴後換衣服算管得鬆了。
來美國後才知道哪個“吹風”叫“風簾機”,計算機中心就根本沒有,人家用的是玻璃門。超市倒是有這玩藝。而且它也根本不是為了
“吹掉身上的灰塵”。
一群豬一樣的貨色還好意思到美國
“受訓”。後來謠傳說DPS8來的時候還附帶了一台DPS6小型機,白送給華南工學院計算機系了。還說得
“有的鼻子有眼,有的沒有”,還可以帶十來個終端什麼云云。反正學校沒正式公布這個消息,我沒見過這個機器,也不知道放這個機器的房子在哪裡。反正學
《計算機操作系統》時
楊學偉(人名)搞到兩台IBM-PC/AT286裝了個Xenix(是這個音,希望我沒串錯字)胡弄我們。他一個機械系的,屁都不懂就給我們講
《計算機操作系統》,還讓我們做
“信號燈”實驗。屁都說不清楚,前半學期胡說些 C 語言。後半學期照着書唸。反正當時我還以為
“信號燈”就是
“全局變量”。搞了半天沒搞出
“信號燈”的效果。
倒是真見到沒有“信號燈”的效果,各位同學打印的內容混在一起(估計是因為大家用同一帳號Login,不同帳號打印理應由SPOOLING系統分開不會混在一起的,
楊學偉(人名)知道啥SPOOLING,只會照着書唸)。啥沒學到,幾晚的實驗課只用計算機打印了個當年日曆。打印紙倒是不用收錢。但卻不是有孔一頁頁那種。而是像
擦屁股紙那樣一大卷的。打着打着就走歪了(太重,打印機進紙機械的磨擦力帶不動)。他還敢怨我們浪費紙張。看來說華南工學院計算機系有個
“霍尼威爾DPS6”小型機根本就是當時的業餘五毛吹噓祖國繁榮興旺的小作品。否則
楊學偉(人名)也不會讓我們到IBM-PC/AT286上亂搞。
唉,一切都像夢一場。偉大祖國到底有沒有幾個
“學習成績‘很’好”的嘛。起來走兩步嘛(
華南工學院計算機系代系歌:
起來,學習成績很好的同學,離開那個輪椅走上兩步,中華民族到了沒有計算機的時候)。不至於
華為(人名)(唸
話為,小說
《紅岩》里
江姐(人名)的契弟,渣滓洞監獄瘋子
華子良(人名)與華瑩山游擊隊女匪首
雙槍老太婆(人名)的兒子,重慶大學大學生。什麼世道嘛,中華民國時期那麼少人能有機會上大學,居然還讓敵人的兒子占了一個學位,還策反拐跑了一個資產階級的女兒,女大學生
孫明霞(人名)。真不明白有沒有
工農子弟被資產階級小姐給策反的。當時上大學沒有
“政審”這一關麼?當時中共有個文藝規定,文藝作品裡共產黨不允許有
女特務或
女公安偵察員,國民黨的對手角色必須是女的。這樣為了開展工作,
即使上了床,也是共產黨吃國民黨的豆腐。
不明白為什麼明明是男的損失精液,卻是吃了別人,與
《聊齋》的說法完全相反)被禁運就改行
養豬了。兩萬個清華計算機系大學畢業生,養豬肯定是養不過一百個華南農學院畜牧系的畢業生的嘛。呵呵。只要美國
再堅持最後五分鐘不開禁,
華為(人名)的隊伍都要散了改投
傑克馬(人名)門下去享受他們前幾世修來的996寫網頁的
福份了。吖,
一眨眼之間,中美都從“蜜月”走到“掟煲”了。
飯桶們(人名)也都垂垂老矣,能飯倒是
尚能飯,但估計離
頃之三遺矢也不會太遠了吧。
今天就說這些吧。下邊給兩個CFGs,
大家對比一下有啥不同吧。那個帕撕卡的語法含有 P→ε 我也發現了,
不算今天的答案。還有更本質的不同。
要說出為啥會這樣。祝大家避疫愉快,平安渡過。希望疫情解除後大家還能完璧歸來,全須全眼,沒被科學家用納米脂肪粒
“駭客”過你們的細胞。
一句話,保持數據和代碼intact最重要。
屁馥喇嘛(人名)懂不懂mRNA技術。想與你合夥做
香水生意。我們可以將
麝香、龍涎香的mRNA模板做成針劑出售,打一針能香九個月以上。到時不但屎尿香,放屁都香。香水針劑的名字我都想好了,叫
“抹香猴”。北方說
“包子有肉不在褶上”,廣東說
“有麝自然香”。同一個意思。
Context-free Grammar for Standard Pascal
1. <Program>::=
<ProgramHeader> <Declarations> <CompoundStatement> .
2. <ProgramHeader>::=
program id ;
| program id ( <IdList> ) ;
3. <Declarations>::=
<ConstantDefinitions> <TypeDefinitions> <VariableDeclarations> <ProcedureDeclarations>
4. <ConstantDefinitions>::=
ε
| const <ConstantDefinitionList>
5. <ConstantDefinitionList>::=
<ConstDef>
| <ConstDef> <ConstantDefinitionList>
6. <ConstDef>::=
id = constant ;
7. <TypeDefinitions>::=
ε
| type <TypeDefinitionList>
8. <TypeDefinitionList>::=
<TypeDef>
| <TypeDef> <TypeDefinitionList>
9. <TypeDef>::=
id = <TypeSpecifier> ;
10. <VariableDeclarations>::=
ε
| var <VariableDeclarationList>
11. <VariableDeclarationList>::=
<VarDec>
| <VarDec> <VariableDeclarationList>
12. <VarDec>::=
<IdList> : <TypeSpecifier> ;
13. <ProcedureDeclarations>::=
ε
| <ProcDec> <ProcedureDeclarations>
14. <ProcDec>::=
<ProcHeader> forward ;
| <ProcHeader> <Declarations> <CompoundStatement> ;
| <FuncHeader> forward ;
| <FuncHeader> <Declarations> <CompoundStatement> ;
15. <ProcHeader>::=
procedure id <Arguments> ;
16. <FuncHeader>::=
function id <Arguments> : <TypeSpecifier> ;
17. <Arguments>::=
ε
| ( <ArgumentList> )
18. <ArgumentList>::=
<Arg>
| <Arg> ; <ArgumentList>
19. <Arg>::=
<IdList> : <TypeSpecifier>
| var <IdList> : <TypeSpecifer>
20. <CompoundStatement>::=
begin <StatementList> end
21. <StatementList>::=
<Statement>
| <Statement> ; <StatementList>
22. <Statement>::=
ε
| <CompoundStatement>
| <AssignmentStatement>
| <ProcedureCall>
| <ForStatement>
| <WhileStatement>
| <IfStatement>
| <CaseStatement>
| <RepeatStatement>
23. <AssignmentStatement>::=
<Variable> := <Expression>
24. <ProcedureCall>::=
id <Actuals>
25. <ForStatement>::=
for id := <Expression> to <Expression> do <Statement>
| for id := <Expression> downto <Expression> do <Statement>
26. <WhileStatement>::=
while <Expression> do <Statement>
27. <IfStatement>::=
if <Expression> then <Statement>
| if <Expression> then <Statement> else <Statement>
28. <RepeatStatement>::=
repeat <StatementList> until <Expression>
29. <CaseStatement>::=
case <Expression> of <CaseList> end
30. <CaseList>::=
<Case>
| <Case> ; <CaseList>
31. <Case>::=
<ConstantList> : <Statement>
32. <ConstantList>::=
constant
| constant , <ConstantList>
33. <Expression>::=
<SimpleExpression>
| <SimpleExpression> = <SimpleExpression>
| <SimpleExpression> <> <SimpleExpression>
| <SimpleExpression> < <SimpleExpression>
| <SimpleExpression> <= <SimpleExpression>
| <SimpleExpression> > <SimpleExpression>
| <SimpleExpression> >= <SimpleExpression>
34. <SimpleExpression>::=
<Term>
| <SimpleExpression> + <Term>
| <SimpleExpression> - <Term>
| <SimpleExpression> or <Term>
35. <Term>::=
<Factor>
| <Term> * <Factor>
| <Term> / <Factor>
| <Term> div <Factor>
| <Term> mod <Factor>
| <Term> and <Factor>
36. <Factor>::=
( <Expression> )
| + <Factor>
| - <Factor>
| not <Factor>
| <FunctionCall>
| constant
| <Variable>
37. <FunctionCall>::=
id <Actuals>
38. <Actuals>::=
ε
| ( <ExpressionList> )
39. <ExpressionList>::=
<Expresssion>
| <Expression> , <ExpressionList>
40. <Variable>::=
id
| <Variable> . id
| <Variable> ^
| <Variable> [ <ExpressionList> ]
41. <TypeSpecifier>::=
id
| ^ <TypeSpecifier>
| ( <IdList> )
| constant .. constant
| array [ <DimensionList> ] of <TypeSpecifier>
| record <FieldList> end
| file of <TypeSpecifier>
42. <DimensionList>::=
<Dimension>
| <Dimension> , <DimensionList>
43. <Dimension>::=
constant .. constant
| id
44. <FieldList>::=
<Field>
| <Field> ; <FieldList>
45. <Field>::=
<IdList> : <TypeSpecifier>
46. <IdList>::=
id
| id , <IdList>
==============================================================================
C grammar from n1124_pdf
Annex A
(informative)
Language syntax summary
1 NOTE The notation is described in 6.1.
1. <token>::=
<keyword>
| <identifier>
| <constant>
| <string-literal>
| <punctuator>
2. <preprocessing-token>::=
<header-name>
| <identifier>
| <pp-number>
| <character-constant>
| <string-literal>
| <punctuator>
| each non-white-space character that cannot be one of the above
3. <keyword>::= one of
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
_Bool
_Complex
_Imaginary
4. <identifier>::=
<identifier-nondigit>
| <identifier> <identifier-nondigit>
| <identifier> <digit>
5. <identifier-nondigit>::=
<nondigit>
| <universal-character-name>
| other implementation-defined characters
6. <nondigit>::= one of
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
7. <digit>::= one of
0 1 2 3 4 5 6 7 8 9
8. <universal-character-name>::=
u <hex-quad>
| U <hex-quad> <hex-quad>
9. <hex-quad>::=
<hexadecimal-digit> <hexadecimal-digit>
| <hexadecimal-digit> <hexadecimal-digit>
10. <constant>::=
<integer-constant>
| <floating-constant>
| <enumeration-constant>
| <character-constant>
11. <integer-constant>::=
<decimal-constant> <integer-suffix>_opt
| <octal-constant> <integer-suffix>_opt
| <hexadecimal-constant> <integer-suffix>_opt
12. <decimal-constant>::=
<nonzero-digit>
| <decimal-constant> <digit>
13. <octal-constant>::=
0
| <octal-constant> <octal-digit>
14. <hexadecimal-constant>::=
<hexadecimal-prefix> <hexadecimal-digit>
| <hexadecimal-constant> <hexadecimal-digit>
15. <hexadecimal-prefix>::= one of
0x 0X
16. <nonzero-digit>::= one of
1 2 3 4 5 6 7 8 9
17. <octal-digit>::= one of
0 1 2 3 4 5 6 7
18. <hexadecimal-digit>::= one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
19. <integer-suffix>::=
<unsigned-suffix> <long-suffix>_opt
| <unsigned-suffix> <long-long-suffix>
| <long-suffix> <unsigned-suffix>_opt
| <long-long-suffix> <unsigned-suffix>_opt
20. <unsigned-suffix>::= one of
u U
21. <long-suffix>::= one of
l L
22. <long-long-suffix>::= one of
ll LL
23. <floating-constant>::=
<decimal-floating-constant>
| <hexadecimal-floating-constant>
24. <decimal-floating-constant>::=
<fractional-constant> <exponent-part>_opt <floating-suffix>_opt
| <digit-sequence> <exponent-part> <floating-suffix>_opt
25. <hexadecimal-floating-constant>::=
<hexadecimal-prefix> <hexadecimal-fractional-constant>
| <binary-exponent-part> <floating-suffix>_opt
| <hexadecimal-prefix> <hexadecimal-digit-sequence>
| <binary-exponent-part> <floating-suffix>_opt
26. <fractional-constant>::=
<digit-sequence>_opt . <digit-sequence>
| <digit-sequence> .
27. <exponent-part>::=
e <sign>_opt <digit-sequence>
| E <sign>_opt <digit-sequence>
28. <sign>::= one of
+ -
29. <digit-sequence>::=
<digit>
| <digit-sequence> <digit>
30. <hexadecimal-fractional-constant>::=
<hexadecimal-digit-sequence>_opt .
| <hexadecimal-digit-sequence>
| <hexadecimal-digit-sequence> .
31. <binary-exponent-part>::=
p <sign>_opt <digit-sequence>
| P <sign>_opt <digit-sequence>
32. <hexadecimal-digit-sequence>::=
<hexadecimal-digit>
| <hexadecimal-digit-sequence> <hexadecimal-digit>
33. <floating-suffix>::= one of
flFL
34. <enumeration-constant>::=
<identifier>
35. <character-constant>::=
' <c-char-sequence> '
| L' <c-char-sequence> '
36. <c-char-sequence>::=
<c-char>
| <c-char-sequence> <c-char>
37. <c-char>::=
any member of the source character set except the single-quote ', backslash , or <new-line> character
| <escape-sequence>
38. <escape-sequence>::=
<simple-escape-sequence>
| <octal-escape-sequence>
| <hexadecimal-escape-sequence>
| <universal-character-name>
39. <simple-escape-sequence>::= one of
' " ?
a b f n r t v
40. <octal-escape-sequence>::=
<octal-digit>
| <octal-digit> <octal-digit>
| <octal-digit> <octal-digit> <octal-digit>
41. <hexadecimal-escape-sequence>::=
x <hexadecimal-digit>
| <hexadecimal-escape-sequence> <hexadecimal-digit>
42. <string-literal>::=
" <s-char-sequence>_opt "
| L" <s-char-sequence>_opt "
43. <s-char-sequence>::=
<s-char>
| <s-char-sequence> <s-char>
44. <s-char>::=
any member of the source character set except the double-quote ", backslash , or <new-line> character
| <escape-sequence>
45. <punctuator>::= one of
[ ] ( ) { } . ->
++ -- & * + - ~ !
/ % << >> < > <= >= == != ^ | && ||
? : ; ...
= *= /= %= += -= <<= >>= &= ^= |=
, # ##
<: :> <% %> %: %:%:
46. <header-name>::=
< <h-char-sequence> >
| " <q-char-sequence> "
47. <h-char-sequence>::=
<h-char>
| <h-char-sequence> <h-char>
48. <h-char>::=
any member of the source character set except the <new-line> character and >
49. <q-char-sequence>::=
<q-char>
| <q-char-sequence> <q-char>
50. <q-char>::=
any member of the source character set except the <new-line> character and "
51. <pp-number>::=
<digit>
| . <digit>
| <pp-number> <digit>
| <pp-number> <identifier-nondigit>
| <pp-number> e <sign>
| <pp-number> E <sign>
| <pp-number> p <sign>
| <pp-number> P <sign>
| <pp-number> .
52. <primary-expression>::=
<identifier>
| <constant>
| <string-literal>
| ( <expression> )
53. <postfix-expression>::=
<primary-expression>
| <postfix-expression> [ <expression> ]
| <postfix-expression> ( <argument-expression-list>_opt )
| <postfix-expression> . <identifier>
| <postfix-expression> -> <identifier>
| <postfix-expression> ++
| <postfix-expression> --
| ( <type-name> ) { <initializer-list> }
| ( <type-name> ) { <initializer-list> , }
54. <argument-expression-list>::=
<assignment-expression>
| <argument-expression-list> , <assignment-expression>
55. <unary-expression>::=
<postfix-expression>
| ++ <unary-expression>
| -- <unary-expression>
| <unary-operator> <cast-expression>
| sizeof <unary-expression>
| sizeof ( <type-name> )
56. <unary-operator>::= one of
& * + - ~ !
57. <cast-expression>::=
<unary-expression>
| ( <type-name> ) <cast-expression>
58. <multiplicative-expression>::=
<cast-expression>
| <multiplicative-expression> * <cast-expression>
| <multiplicative-expression> / <cast-expression>
| <multiplicative-expression> % <cast-expression>
59. <additive-expression>::=
<multiplicative-expression>
| <additive-expression> + <multiplicative-expression>
| <additive-expression> - <multiplicative-expression>
60. <shift-expression>::=
<additive-expression>
| <shift-expression> << <additive-expression>
| <shift-expression> >> <additive-expression>
61. <relational-expression>::=
<shift-expression>
| <relational-expression> < <shift-expression>
| <relational-expression> > <shift-expression>
| <relational-expression> <= <shift-expression>
| <relational-expression> >= <shift-expression>
62. <equality-expression>::=
<relational-expression>
| <equality-expression> == <relational-expression>
| <equality-expression> != <relational-expression>
63. <AND-expression>::=
<equality-expression>
| <AND-expression> & <equality-expression>
64. <exclusive-OR-expression>::=
<AND-expression>
| <exclusive-OR-expression> ^ <AND-expression>
65. <inclusive-OR-expression>::=
<exclusive-OR-expression>
| <inclusive-OR-expression> | <exclusive-OR-expression>
66. <logical-AND-expression>::=
<inclusive-OR-expression>
| <logical-AND-expression> && <inclusive-OR-expression>
67. <logical-OR-expression>::=
<logical-AND-expression>
| <logical-OR-expression> || <logical-AND-expression>
68. <conditional-expression>::=
<logical-OR-expression>
| <logical-OR-expression> ? <expression> : <conditional-expression>
69. <assignment-expression>::=
<conditional-expression>
| <unary-expression> <assignment-operator> <assignment-expression>
70. <assignment-operator>::= one of
= *= /= %= += -= <<= >>= &= ^= |=
71. <expression>::=
<assignment-expression>
| <expression> , <assignment-expression>
72. <constant-expression>::=
<conditional-expression>
73. <declaration>::=
<declaration-specifiers> <init-declarator-list>_opt ;
74. <declaration-specifiers>::=
<storage-class-specifier> <declaration-specifiers>_opt
| <type-specifier> <declaration-specifiers>_opt
| <type-qualifier> <declaration-specifiers>_opt
| <function-specifier> <declaration-specifiers>_opt
75. <init-declarator-list>::=
<init-declarator>
| <init-declarator-list> , <init-declarator>
76. <init-declarator>::=
<declarator>
| <declarator> = <initializer>
77. <storage-class-specifier>::=
typedef
| extern
| static
| auto
| register
78. <type-specifier>::=
void
| char
| short
| int
| long
| float
| double
| signed
| unsigned
| _Bool
| _Complex
| <struct-or-union-specifier>
| <enum-specifier>
| <typedef-name>
79. <struct-or-union-specifier>::=
<struct-or-union> <identifier>_opt { <struct-declaration-list> }
| <struct-or-union> <identifier>
80. <struct-or-union>::=
struct
| union
81. <struct-declaration-list>::=
<struct-declaration>
| <struct-declaration-list> <struct-declaration>
82. <struct-declaration>::=
<specifier-qualifier-list> <struct-declarator-list> ;
83. <specifier-qualifier-list>::=
<type-specifier> <specifier-qualifier-list>_opt
| <type-qualifier> <specifier-qualifier-list>_opt
84. <struct-declarator-list>::=
<struct-declarator>
| <struct-declarator-list> , <struct-declarator>
85. <struct-declarator>::=
<declarator>
| <declarator>_opt : <constant-expression>
86. <enum-specifier>::=
enum <identifier>_opt { <enumerator-list> }
| enum <identifier>_opt { <enumerator-list> , }
| enum <identifier>
87. <enumerator-list>::=
<enumerator>
| <enumerator-list> , <enumerator>
88. <enumerator>::=
<enumeration-constant>
| <enumeration-constant> = <constant-expression>
89. <type-qualifier>::=
const
| restrict
| volatile
90. <function-specifier>::=
inline
91. <declarator>::=
<pointer>_opt <direct-declarator>
92. <direct-declarator>::=
<identifier>
| ( <declarator> )
| <direct-declarator> [ <type-qualifier-list>_opt <assignment-expression>_opt ]
| <direct-declarator> [ static <type-qualifier-list>_opt <assignment-expression> ]
| <direct-declarator> [ <type-qualifier-list> static <assignment-expression> ]
| <direct-declarator> [ <type-qualifier-list>_opt * ]
| <direct-declarator> ( <parameter-type-list> )
| <direct-declarator> ( <identifier-list>_opt )
93. <pointer>::=
* <type-qualifier-list>_opt
| * <type-qualifier-list>_opt <pointer>
94. <type-qualifier-list>::=
<type-qualifier>
| <type-qualifier-list> <type-qualifier>
95. <parameter-type-list>::=
<parameter-list>
| <parameter-list> , ...
96. <parameter-list>::=
<parameter-declaration>
| <parameter-list> , <parameter-declaration>
97. <parameter-declaration>::=
<declaration-specifiers> <declarator>
| <declaration-specifiers> <abstract-declarator>_opt
98. <identifier-list>::=
<identifier>
| <identifier-list> , <identifier>
99. <type-name>::=
<specifier-qualifier-list> <abstract-declarator>_opt
100. <abstract-declarator>::=
<pointer>
| <pointer>_opt <direct-abstract-declarator>
101. <direct-abstract-declarator>::=
( <abstract-declarator> )
| <direct-abstract-declarator>_opt [ <assignment-expression>_opt ]
| <direct-abstract-declarator>_opt [*]
| <direct-abstract-declarator>_opt ( <parameter-type-list>_opt )
102. <typedef-name>::=
<identifier>
103. <initializer>::=
<assignment-expression>
| { <initializer-list> }
| { <initializer-list> , }
104. <initializer-list>::=
<designation>_opt <initializer>
| <initializer-list> , <designation>_opt <initializer>
105. <designation>::=
<designator-list> =
106. <designator-list>::=
<designator>
| <designator-list> <designator>
107. <designator>::=
[ <constant-expression> ]
| . <identifier>
108. <statement>::=
<labeled-statement>
| <compound-statement>
| <expression-statement>
| <selection-statement>
| <iteration-statement>
| <jump-statement>
109. <labeled-statement>::=
<identifier> : <statement>
| case <constant-expression> : <statement>
| default : <statement>
110. <compound-statement>::=
{ <block-item-list>_opt }
111. <block-item-list>::=
<block-item>
| <block-item-list> <block-item>
112. <block-item>::=
<declaration>
| <statement>
113. <expression-statement>::=
<expression>_opt ;
114. <selection-statement>::=
if ( <expression> ) <statement>
| if ( <expression> ) <statement> else <statement>
| switch ( <expression> ) <statement>
115. <iteration-statement>::=
while ( <expression> ) <statement>
| do <statement> while ( <expression> ) ;
| for ( <expression>_opt ; <expression>_opt ; <expression>_opt ) <statement>
| for ( <declaration> <expression>_opt ; <expression>_opt ) <statement>
116. <jump-statement>::=
goto <identifier> ;
| continue ;
| break ;
| return <expression>_opt ;
117. <translation-unit>::=
<external-declaration>
| <translation-unit> <external-declaration>
118. <external-declaration>::=
<function-definition>
| <declaration>
119. <function-definition>::=
<declaration-specifiers> <declarator> <declaration-list>_opt <compound-statement>
120. <declaration-list>::=
<declaration>
| <declaration-list> <declaration>
121. <preprocessing-file>::=
<group>_opt
122. <group>::=
<group-part>
| <group> <group-part>
123. <group-part>::=
<if-section>
| <control-line>
| <text-line>
| # <non-directive>
124. <if-section>::=
<if-group> <elif-groups>_opt <else-group>_opt <endif-line>
125. <if-group>::=
# if <constant-expression> <new-line> <group>_opt
| # ifdef <identifier> <new-line> <group>_opt
| # ifndef <identifier> <new-line> <group>_opt
126. <elif-groups>::=
<elif-group>
| <elif-groups> <elif-group>
127. <elif-group>::=
# elif <constant-expression> <new-line> <group>_opt
128. <else-group>::=
# else <new-line> <group>_opt
129. <endif-line>::=
# endif <new-line>
130. <control-line>::=
# include <pp-tokens> <new-line>
| # define <identifier> <replacement-list> <new-line>
| # define <identifier> <lparen> <identifier-list>_opt ) <replacement-list> <new-line>
| # define <identifier> <lparen> ... ) <replacement-list> <new-line>
| # define <identifier> <lparen> <identifier-list> , ... ) <replacement-list> <new-line>
| # undef <identifier> <new-line>
| # line <pp-tokens> <new-line>
| # error <pp-tokens>_opt <new-line>
| # pragma <pp-tokens>_opt <new-line>
| # <new-line>
131. <text-line>::=
<pp-tokens>_opt <new-line>
132. <non-directive>::=
<pp-tokens> <new-line>
133. <lparen>::=
a ( character not immediately preceded by white-space
134. <replacement-list>::=
<pp-tokens>_opt
135. <pp-tokens>::=
<preprocessing-token>
| <pp-tokens> <preprocessing-token>
136. <new-line>::=
the new-line character