2012-04-10 46 views
1

讓我問一下antlr3是否接受下面的例子語法。antlr可以做類型依賴的解析嗎?

for an input , x + y * z , 
it is parsed as x+(y*z) if each in {x,y,z} is a number; 
it is parsed as (x+y)*z if each in {x,y,z} is an object of a particular type T; 

讓我問一下這樣的語法是否有時或很少用於計算機語言。

非常感謝。

+0

爲什麼這個問題專門針對ANTLR3? – 2012-04-10 07:07:05

+0

@IraBaxter對不起,我想到了產品名稱和版本是必要的,以回答的問題。我想知道ANTLR3就足夠了,因爲它可能在現場很受歡迎,而3是最新版本。 – 2012-04-10 07:14:30

+0

您只需要提出具有相對精確的技術答案的問題。 「如何使用鏈表對代碼進行編碼?」應該是一個合理的SO問題,並且與特定的產品/工具/庫無關。那麼,涉及到這些問題,但如果實際神器是不是真正問題的問題,你的問題是不是簡潔,你會爲它遭受虐待。 – 2012-04-10 07:33:38

回答

3

通常,解析器(由解析器生成器生成)僅檢查語法。 (我相信ANTLR是通過回溯來完成的;其他解析引擎[GLR,Earley]通過對可能的解析進行並行探索來實現它),如果增加了語義檢查信息,可以拒絕不符合語義約束的分析。

根據我的經驗,人們往往不會構建這樣的解析器,部分原因是很難向用戶解釋。如果他們沒有得到它,你的解析器不成功;就解釋能力而言,你的例子尤其糟糕。他們也傾向於不這樣做,因爲他們需要這種類型的信息,並且在解析時收集並不總是很方便。海灣合作委員會解析器著名做到這這這解析語句,如

X*T; 

和解析器是有點,因爲需要解析和它去收集此類信息的一塌糊塗。

我懷疑ANTLR可以檢查語義謂詞。獲得這類語義檢查類型信息的容易程度是另一個問題;我在這裏沒有經驗。

我們的DMS Software Reengineering Toolkit使用的GLR解析引擎確實具有「語義」謂詞。通過架構設計獲得真正的語義類型信息並不是那麼容易。我們希望這樣的謂詞能夠脫離「語法」。但是,所有的事情(包括類型推斷)都是由語法驅動的。所以我們把純粹的本地信息固定在提議的縮減之上。這是格外得心應手中(未)識別爲獨立的類型解析的,下面的特有FORTRAN構建用於嵌套-DO-終止與共享-DO-終止:

 DO 10 I=1,10,1 
     DO 10 J=1,10,1 
      A(I,J)=0 
10 CONTINUE 
20 CONTINUE 

 DO 20 I=1,10,1 
     DO 10 J=1,10,1 
      A(I,J)=0 
    10 CONTINUE 
    20 CONTINUE 

解析器,在純粹的語法水平,這兩個看起來像:

DO <INT> <VAR>=... 
     DO <INT> <VAR>=... 
      <STMTS> 
    <INT> CONTINUE 
    <INT> CONTINUE 

如何才能確定哪些CONTINUE語句屬於哪個做的僅此信息consrtuct?你不能。

DMS FORTRAN解析器通過爲DO循環提供兩組規則來完成此操作,一個用於非共享連續,一個用於共享。他們使用語義謂詞進行區分,檢查CONTINUE語句標籤是否與DO循環指定標籤匹配。因此,DMS FORTRAN解析器在解析時獲得循環嵌套權。 AFAIK,所有其他FORTRAN編譯器分別解析這些語句,然後在DO後循環中將DO循環嵌套在一起。

是的,雖然FORTRAN有這個(令人困惑的)構造,但我沒有其他現代語言複製它。