[英]Optional vs. mandatory terminators in context-free grammar definition
在關於編譯器的書籍章節中,有以下語法定義和示例代碼。
...
statement: whileStatement
| ifStatement
| ... // Other statement possibilities
| '{' statementSequence '}'
whileStatement: 'while' '(' expression ')' statement
ifStatement: ... // Definition of "if"
statementSequence: '' // empty sequence (null)
| statement ';' statementSequence
expression: ... // Definition of "expression"
... // More definitions follow
while (expression) {
statement;
statement;
while (expression) {
while(expression)
statement;
statement;
}
}
如何為代碼的最內側while
循環有效,而不{
}
? 在我看來,語句定義需要它們。 這是書中的錯誤還是我誤解了語法?
[編輯]我對任何含糊不清表示歉意。 上面輸入的所有內容都是從書中逐字記錄下來的。 遺漏不是我的行為。
你同時聲明說,以后)
來聲明。 您的語法沒有完全指定statement
,但它不需要大括號。 只有語句序列才需要大括號。
再次考慮您的示例代碼:
1 while (expression) {
2 statement;
3 statement;
4 while (expression) {
5 while(expression)
6 statement;
7 statement;
8 }
9 }
你為什么擔心第6行沒有括號,但是不在乎第2,3和7行也缺少它們? 語法是說while
循環以statement
結束,而statementSequence
及其必需的大括號只是statement
的許多替代方案之一。 第5行和第6行完全匹配該規則 - 除了';'
,在規則中沒有位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.