Atitit.antlr實現詞法分析

来源:http://www.cnblogs.com/attilax/archive/2016/04/23/5423482.html
-Advertisement-
Play Games

Atitit.antlr實現詞法分析 1.1. antlrworks-1.4.3.jar wizard1 1.2. 詞法的類型 id,int,float ,comment,str,char,white space2 1.3. 3.1詞法文件的規定3 1.4. 3.2字元編碼定義4 1.5. 最後需要 ...


Atitit.antlr實現詞法分析

 

1.1.  antlrworks-1.4.3.jar   wizard1

1.2. 詞法的類型 idint,float ,comment,str,char,white space2

1.3. 3.1詞法文件的規定3

1.4. 3.2字元編碼定義4

1.5. 最後需要考慮的詞法的定義5

1.5.2. 文法可視化5

1.6. 或者使用antlrworks生成需要的詞法分析器6

1.6.2. 查看每一個標識符的代碼7

1.6.3. 表達式驗證7

1.7. 獲取tokens9

1.8. Token的含義and type11

1.9. 3.3終結符定義方法11

1.10. 3.11大小寫敏感12

1.11. contains grammar SimpleCalc; names must be identical13

1.12. org.antlr.runtime.tree.CommonTree cannot be cast to org.antlr.tool.GrammarAST13

1.13. no viable alternative at character '='14

1.14. Antlr 支持多種目標語言,可以把生成的分析器生成為 JavaC#CPythonJavaScript 等多種語言 14

1.15. 關鍵字and運算符的定義14

2. 參考15

 

 

1.1.  antlrworks-1.4.3.jar   wizard

 

 

 

1.2. 詞法的類型 idint,float ,comment,str,char,white space

Zai antlr裡面兒的keyword是所有的大寫

 public static final int CHAR=4;

    public static final int COMMENT=5;

    public static final int ESC_SEQ=6;

    public static final int EXPONENT=7;

    public static final int FLOAT=8;

    public static final int HEX_DIGIT=9;

    public static final int ID=10;

    public static final int INT=11;

    public static final int OCTAL_ESC=12;

    public static final int STRING=13;

    public static final int UNICODE_ESC=14;

public static final int WS=15;

 

 

讀者可能對"單詞"感到有點疑惑,不明白到底什麼才是詞法分析中所說的"單詞"。試圖回答這個問題就必須瞭解幾個基本概念。這裡,引入幾個程式設計語言相關的名詞。

(1)標識符:用戶自定義的變數名、函數名等字元串。

(2)關鍵字:具有特殊含義的標識符。

(3)運算符:例如+、-、*、/ 等。

(4)常量:例如3.24、92等。

(5)界符:具有特殊含義的符號,如分號、括弧等。

 

作者::  ★(attilax)>>>   綽號:老哇的爪子  全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊  漢字名:艾龍,  EMAIL:[email protected]

轉載請註明來源: http://www.cnblogs.com/attilax/

 

 

 

 

 

這裡面的ID INT FLOAT什麼的並不是關鍵字,可以自定義的..

1.3. 3.1詞法文件的規定

與第二章中的例子不同,在ANTLR中詞法分析定義的規則名必須以大寫字母開頭如“LETTER”“NewLine”。我們在第一章示例中的詞法分析部分與語法分析部分合寫到一個E.g文件中,ANTLR允許把詞法分析部分和語法分析寫分別寫到兩個文件中。

T.g文件存放語法定義:

grammar T;

Options {tokenVocab = T2;}

a : B*;

 

 

T2.g文件存放詞法定義:

lexer grammar T2;

B : ‘b’;

將詞法分析放到單獨的文件中時文法的名稱也要和文件的名稱相同,在grammar關鍵字之前要加入lexer關鍵字。上例中的T.g文件生成語法分析類TParserT2.g文件生成詞法分析類T2Lexer。在T.g中要加入一個設置項tokenVocab來指定語法文件所需的詞法單詞是來自T2.g。這樣就可以按照第一章示例中的方法編譯運行分析器了。

 

 

1.4. 3.2字元編碼定義

詞法分析與源代碼直接接觸,因為源代碼是由字元串組成的,所以我們需要定義字元的方法。ANTLR有兩種方法定義字元,第一種方法是:ANTLR可以直接使用字元本身很簡單直觀的定義基本符號。

CHAR : ‘a’ | ‘b’ | ‘c’;

但這種定義只限於ASCII碼的字元,下麵的定義是不合法的。

CHAR : ‘代碼’;

定義漢字這樣除ASCII碼以外的字元只能用第二種方法十六進位編碼定義法。使用“\u”開頭加四位十六進位數定義來定義一個字元。

CHAR : ‘\u0040’;

C#中使用String.Format("{0:x} {1:x}", Convert.ToInt32(''), Convert.ToInt32(''));可以獲得漢字的編碼。如上面的CHAR : ‘代碼’;我們可以定義為:

CHAR : '\u4ee3' '\u7801';

編碼有很多種GB2312的編碼範圍是A1A1 ~ FEFE,去掉未定義的區域之後可以理解為實際編碼範圍是A1A1 ~ F7FEGBK的整體編碼範圍是為8140 ~ FEFEBIG5字元編碼範圍是A140 ~ F97E

 

字元集

編碼範圍

GB2312

A1A1 ~ 7E7E

GBK

8140 ~ FEFE

BIG5

A140 ~ F97E

Unicode

000000 ~ 10FFFF

UTF-8

000000 ~ 10FFFF

 

 

其中漢字在GB2312中的編碼範圍為:‘\uB0A1' .. '\uF7FE',漢字在Unicode編碼範圍為:’\u4E00’ .. ‘\u9FA5’ | ‘\uF900’ .. ‘\uFA2D’

 

1.5. 最後需要考慮的詞法的定義

,在 Antlr 中語法定義和詞法定義通過規則的第一個字元來區別, 規定語法定義符號的第一個字母小寫,而詞法定義符號的第一個字母大寫。算術表達式中用到了 4 類記號 ( Antlr 中被稱為 Token),分別是標識符 ID,表示一個變數;常量 INT,表示一個常數;換行符 NEWLINE 和空格 WS,空格字元在語言處理時將被跳過,skip() 是詞法分析器類的一個方法。如清單 3 所示:

 

1.5.1.1.1. 清單 3. 記號定義

 ID : ('a'..'z' |'A'..'Z')+ ;

 INT : '0'..'9' + ;

 NEWLINE:'\r' ? '\n' ;

 WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;

 

1.5.1. 文法可視化

使用 Antlrworks 打開 Expr.gAntlrworks 對每一個文法定義都做了可視化顯示。整體的文法定義如圖 3

1.5.1.1.1. 3. 文法定義的可視化

其中語法規則和詞法記號的定義都有對應的圖形表示方式。比如語法規則 atom 的圖示形式如圖 4 所示:

1.5.1.1.2. 4. 語法規則 atom 的可視化

詞法記號 ID 的圖示形式如圖 5 所示:

1.5.1.1.3. 5. 詞法記號 ID 的可視化

使用 Antlrworks 還可以對語法分析樹可視化,在 Antlrworks GUI 視窗中,點擊 Run ->Debug, Input Text 視窗中輸入 a+(2 + b)Start Rule 選擇 prog, 然後完成調試,可以看到 a+(2 + b) 時的語法分析樹,如圖 6 所示:

 

 

1.6. 或者使用antlrworks生成需要的詞法分析器

 >>menubar >gene  。。  到個g文件../output目錄下麵

 

Or use antlr tool..

 

運行 Antlr  生成需要的詞法分析器

完成文法定義之後,即可以運行 Antlr,為我們生成需要的詞法分析器和語法分析器。在命令行運行以下下命令,如清單 4 所示:

1.6.0.1.1. 清單 4. 運行 Antlr

java  org.antlr.Tool  c:/

antlr_intro\src\expr\Expr.g

 

成功運行Antlr之後,將為我們生成 3 個文件,Expr.tokensExprLexer.javaExprParser.java。其中Expr.tokens為文法中用到的各種符號做了數字化編號,我們可以不關註這個文件。ExprLexerAntlr生成的詞法分析器,ExprParserAntlr 生成的語法分析器,如圖 1 所示。

1.6.0.1.2. 1. Antlr 生成結果

 

1.6.1. 查看每一個標識符的代碼

Antlrwork hto select left menu symb..then menubar >gene>show rule coe

Then show the code form lexelParser...java..

 

1.6.2. 表達式驗證

基於 Antlr 生成的詞法分析器和語法分析器後,可以基於它們來驗證我們的輸入的表達式是否合法。我們需要調用 Antlr API 完成以下 Java 程式,如清單 5 所示:

1.6.2.1.1. 清單 5. 調用分析器

 public static void run(String expr) throws Exception {

 ANTLRStringStream in = new ANTLRStringStream(expr);

 ExprLexer lexer = new ExprLexer(in);

CommonTokenStream tokens = new CommonTokenStream(lexer);

ExprParser parser = new ExprParser(tokens);

parser.prog();

 }

對每一個輸入的字元串,我們構造一個 ANTLRStringStream in,用 in 構造詞法分析器 lexer,詞法分析的作用是產生記號,用詞法分析器 lexer 構造一個記號流 tokens,然後再使用 tokens 構造語法分析器 parser,至此已經完成詞法分析和語法分析的準備工作。最終調用語法分析器的規則 prog,完成對錶達式的驗證。詳細的 Java 程式參考樣例代碼中的 Test.java

當輸入合法的的表達式時,分析器沒有任何輸出,表示語言被分析器接受;當輸入的表達式違反文法規則時,比如“a + (b * 3”,分析器輸出 line 0:-1 mismatched input '<EOF>' expecting ')';提示期待一個右括弧卻遇到了結束符號。如圖 2 所示:

1.6.2.1.2. 2. 表達式驗證結果

 

 

1.7. 獲取tokens

 

public static void main(String[] args) {

 

run(" where=\"atiq422\"   ");

System.out.println("--f");

}

public static void run(String 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題的描述: 一個項目,涉及到了 兩個數據源,分別使用的是 兩個不同的 資料庫連接池,其中一個是 poxool 連接池,問題在於,spring在啟動時,只初始化其中的一個 資料庫連接池中的資料庫連接,而 poxool配置的資料庫連接池,在啟動時 沒有進行初始化,一個資料庫連接也沒有初始化好,所以導致 ...
  • 本文章向碼農介紹Typecho 博客文章瀏覽次數統計插件Stat,需要的碼農可以參考一下。 我的新博客使用的博客系統是Typecho博客系統,使用的時候發現,該博客系統本身沒有文章瀏覽統計功能,很不習慣。在網上搜了下後發現,有相關的博客插件可以實現,插件的使用很簡單,博客吧在這裡簡單說明下Typec ...
  • 第一步:配置防火牆(預設情況下,埠80和3306是拒絕訪問的,在防火牆上進行配置): vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下兩句) -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j  ...
  • Delphi XE10支持MongoDB的資料庫,提供了個例子restaurants可批量導入數據。 本文對比Delphi例子與MongoDB自帶的mongoimport導入批量數據的性能。 步驟: 1.運行例子前需要先安裝MongoDB, MongoDB安裝及運行mongod.exe,安裝完成後b ...
  • 控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的面向對象編程的法則來削減電腦程式的耦合問題,也是輕量級的Spring框架的核心。 控制反轉一般分為兩種類型,依賴註入(Dependency Injection,簡稱DI)和依賴查找。依賴註入應用比較廣泛。把控制權從具 ...
  • 概述 elixir 本身是一種 immutable 的語言,預設情況下,進程間是不共用任何狀態的,進程之間通過消息來交互。 而 Agent 則封裝了一種進程間共用狀態的方式,通過這種方式,不用顯式的寫 send/receieve 的代碼,就能方便的在進程之間共用狀態。 使用方法 不用 Agent 來 ...
  • 一 問題描述: 兩個數組pPush和pPop分別存儲了壓棧序列和出棧序列,如何判斷出棧序列是否正確,假設元素不重覆。 需要實現的函數: 二 舉例: pPush中序列為:[5 9 1 8 13 4 2 7] 給出一個出棧序列pPop:[8 4 13 1 7 2 9 5],這個出棧序列是正確的。 給出另 ...
  • 一、Java中的static使用之靜態變數 1.Java 中被static修飾的成員稱為靜態成員或類成員。它屬於整個類所有,而不是某個對象所有,即被類的所有對象所共用、且優先於對象存在。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。使用 static 可以修飾變數、方法和代碼塊。 2.pu ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...