2010-11-12 44 views
0

我有一種語言,我正在爲其中包含函數調用的解析器。一些函數名稱是保留的,我想在我的語法中以不同的方式處理它們。在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中的這種模糊問題?

回答

3

處理此問題的正常方法是讓詞法分析器識別特殊名稱,並返回特殊名稱的正確標記類型(SpecialName)和其他標記的常規標識符標記(顯然爲FunctionName)。

但是,它通常需要詞法分析器的不合理程度的預見,說特定的(非保留的,非特殊的)詞是函數名稱而不是簡單的標識符(它也可以是一個簡單的變量 - 除非你使用了sigils來標識函數中的變量的Perl路徑)。

+0

「它通常需要不適當程度的預見」,你能否詳細說明一下? – Akusete 2010-11-14 23:23:17

+1

@Akusete:在許多語法中,用於變量的標識符和用於函數的標識符之間沒有詞法上的區別(Perl是它的標記的例外)。因此,爲了讓詞法分析器確定一個特定的名稱是一個變量或函數,它必須能夠訪問一些非詞彙信息(符號表信息)。如果所有的變量和函數都必須在使用之前聲明/定義,那麼必要的信息可能是可用的 - 而且您已經避免了對預測的需要。像C這樣的語言在這方面傳統上有點草率。 [...繼續...] – 2010-11-14 23:31:24

+0

@Akusete:替代方案是詞法分析器向前看一些令牌,並根據上下文確定它正在查看的名稱必須是函數名稱而不是標識符 - 但通常情況下努力避免將這種語法知識帶入詞法分析器。 – 2010-11-14 23:32:42

0

只要你把SpecialFunction規則首先在詞法分析器文件:

{SpecialFunctionName} { return SpecialName; } 
{FunctionName}   { return FunctionName; } 

同時匹配模式將觸發的第一個規則,因此返回SpecialName而不是FunctionName任何IDENTIFER。

相關問題