我有一種語言,我正在爲其中包含函數調用的解析器。一些函數名稱是保留的,我想在我的語法中以不同的方式處理它們。在EBNF它看起來像在flex中分隔保留的標識符
FunctionCall ::= FunctionName '(' ')'
SpecialFunctionCall :: SpecialName '(' ')'
FunctionName ::= VariableName - SpecialFunctionName
SpecialFunctionName ::= "special_function_a" | "special_function_b"
我的問題是在翻譯從EBNF的例外操作彎曲。
FunctionName {Letter}{LetterOrDigit}
是一個超集SpecialFunctionName,這是一個硬編碼字符串
SpecialFunctionName "special_function_a" | "special_function_b"
因此我從野牛警告說,SpecialFunction將永遠不會被匹配的。我應該合併令牌並比較解析器中的字符串,還是有建議的方法來解決flex中的這種模糊問題?
「它通常需要不適當程度的預見」,你能否詳細說明一下? – Akusete 2010-11-14 23:23:17
@Akusete:在許多語法中,用於變量的標識符和用於函數的標識符之間沒有詞法上的區別(Perl是它的標記的例外)。因此,爲了讓詞法分析器確定一個特定的名稱是一個變量或函數,它必須能夠訪問一些非詞彙信息(符號表信息)。如果所有的變量和函數都必須在使用之前聲明/定義,那麼必要的信息可能是可用的 - 而且您已經避免了對預測的需要。像C這樣的語言在這方面傳統上有點草率。 [...繼續...] – 2010-11-14 23:31:24
@Akusete:替代方案是詞法分析器向前看一些令牌,並根據上下文確定它正在查看的名稱必須是函數名稱而不是標識符 - 但通常情況下努力避免將這種語法知識帶入詞法分析器。 – 2010-11-14 23:32:42