2012-10-03 27 views
0

我想了解如何使用EBNF定義形式文法,特別是用空格分隔的單詞序列分隔的單詞列表,像EBNF語法爲一個空格

<non-terminal> [<word>[ <word>[ <word>[ ...]]] <non-terminal> 
  1. 什麼是定義一個字終端的正確方法?
  2. 什麼是正確的方式來表示所需的空白?
  3. 如何表示可選的重複列表?
  4. EBNF在任何地方有任何關於示例的教程嗎?

非常感謝提前!

回答

2

您必須決定您的詞法分析器是否要爲該空格返回一個令牌(終端)。你還必須決定它(詞法分析器)將如何定義單詞,或者你的語法是否會這樣做(在這種情況下,詞法分析器將作爲終端返回什麼?)。其餘的主要是理解EBNF符號的細微差別的問題,這是一個ISO標準(ISO 14977:1996),它可以從Freely Available Standards免費下載,您也可以從ISO),但這是一個在實踐中很大程度上被忽略的標準。 (我處理語言 - C,C++,SQL - 在定義文件使用BNF符號,但它不以任何人EBNF)

  1. 無論你想一個單詞的正確定義。例如,您需要考慮如何處理名稱P. J. O'Neill。詞法分析器會返回什麼樣的令牌?
  2. 這與前一個問題密切相關;詞法分析器將要返回的終端是什麼?
  3. 可選重複列表包含在{}括號中,或者您可以使用Kleene Star記號。
  4. R. S. Scowen撰寫的論文Extended BNF — A generic base standard解釋EBNF。還有EBNF上的維基百科條目。

我認爲一個非空,空格分隔的單詞列表可能使用來定義:

non_empty_word_list = word { space word } 

,所有的名字也有非終結。您需要根據系統的相關終端來定義這些。

+0

謝謝喬納森 - 你的答案正是我需要的。它還有助於回答我曾經遇到的其他一些問題,例如,是否需要詞法分析階段?如果不需要,我可以通過一次遍歷,甚至可以使用解析器組合器庫。這麼多的問題。再次感謝! – lshepstone