一個簡單的語言的文法(三):做些小調整,並將產生目標換到CSharp2

來源:互聯網
上載者:User

為了後面的tree grammar更簡潔,本篇對上一篇的樹重寫規則和一些文法細節做了些調整。並且,將 產生的lexer和parser的源碼目標換到了CSharp2,以便後面能使用一些.NET的庫。

要使用CSharp2的目標,需要從官網下載相應的執行階段程式庫。當前的最新版是3.1.1,可以從這裡擷取。 CSharp/CSharp2目標的詳細情況,可以查閱官網上的文檔。以上一篇的文法為基礎,要換到CSharp2目標 只要把幾個嵌入動作裡的System.out.println換成Console.WriteLine,把toStringTree換成 ToStringTree,把clear換成Clear就可以了。編譯的時候至少需要引用Antlr3.Runtime.dll。

那麼除去更換產生目標帶來的影響,這次做了些怎樣的修改呢?

首先,文法做了些細微的調整。例如說,program規則從原本允許沒有語句到現在要求至少有一條語句 ;blockStatement為空白block寫了條專門的分支;expressionStatement也添加了一個EXPR_STMT的虛構 token為根節點,等等。

變化最大的還是variableDeclaration及相關規則。上一篇裡這條規則的重寫規則並不區分有初始化與 無初始化、簡單類型與數群組類型的區別;本篇裡則將這兩個區別都明確的寫在了重寫規則裡,以不同的虛 構token來作為產生的樹的根節點。這樣,到寫後面的tree grammar的時候,需要的lookahead數就可以減 少。

ANTLR所產生的AST,以深度優先的方式遍曆,可以看做一個一維的流:每一層父子關係都可以表示為 :

root -> "down" -> element1 -> element2 -> ... -> elementN -> "up" -> ...

其中"down"和"up"是ANTLR插入的虛構token,用於指定樹的層次。

這樣,後面使用tree grammar來遍曆AST時,實際上遍曆的就是這樣一個一維的流 (CommonTreeNodeStream)。所以我們也可以把tree grammar看做是隱含了"down"和"up"虛構token的普 通parser grammar。那麼,tree grammar中需要的lookahead個數的分析,也就跟parser grammar的一樣 。

看看下面的例子。對於上一篇variableDeclaration的重寫規則中出現的變數聲明的類型,可以用這樣 的tree grammar來匹配:

Java代碼

type  : ^( SIMPLE_TYPE INT )  | ^( SIMPLE_TYPE REAL )  | ^( ARRAY_TYPE INT Integer+ )  | ^( ARRAY_TYPE REAL Integer+ )  ;

樹文法的^( ... )就隱含了"down"和"up"這兩個虛構token。實際上這條規則匹配的是:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.