我在Yacc工作(類似於Bison),有類似的場景。
標準語法有時被稱爲「由語法指導的解析」。
有時候,這種情況被稱爲「解析由語義引導」。
例子:
...
// shift operator example
if ((x >> 2) == 0)
...
// consecutive template closing tag example
List<String, List<String>> MyList =
...
讓我們記住,我們的頭腦就像一個編譯器。人類的頭腦可以編譯這個,但以前的語法不能。 Mhhh。讓我們看看人類的頭腦是如何編譯這段代碼的。
正如你已經知道,「X」前的連續「>」和「>」標記表示一個表達式或左值。思維認爲「在表達後,兩個連續的大於符號應該成爲單個移位運算符令牌」。
併爲「串」的令牌:「兩個連續的大於符號,一個類型標識符後,應該成爲兩個連續的模板結束標記令牌」。
我覺得這種情況下不能用通常的運算符優先級處理,轉移或減少,或者只是語法,但使用(「黑客」)由分析器本身提供的一些功能。
我在您的示例語法規則中看不到錯誤。 「操作員」符號避免了混淆你提到的兩種情況。應該關注其使用移位運算符的語法和連續模板結束標記的部分。
operator_expr_example:
lvalue "<<" lvalue |
lvalue ">>" lvalue |
lvalue "&&" lvalue |
;
template_params:
identifier |
template_declaration_example |
array_declaration |
other_type_declaration
;
template_declaration_example:
identifier "<" template_params ">"
;
乾杯。
「+1」考慮「>」作爲單獨的標記,而不是移位運算符或模板結束標記標記。對於「 - 」,負號或減法運算符會發生同樣的情況。 – umlcat 2012-02-01 16:56:29
是的,我記得在C#和Java中使用這種技術,但這些解析器是基於ANTLR的,並且它更簡單一些,儘管並非沒有一些黑客。 – slavasav 2012-02-02 10:15:36