女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

語法分析-Antlr

汽車電子技術 ? 來源:程序猿搬磚 ? 作者: 壞人 ? 2023-03-03 10:14 ? 次閱讀

上一節,我們通過Antlr快速的落地實現了Token的解析,這一節我們還是基于Antlr來實現語法的解析。

語法分析相對來講就復雜多了,我們需要對Token進行推導與組合,生成我們想要表達的式子。

我們先來看一個簡單的例子:

a + b * c

這個看上去很簡單的表達式,我們最終想要得到的結果是b * c 再與 a相加,而不是a + b再乘以 c。

這里就涉及到一個優先級的問題,Antlr支持通過右邊產生式的順序來定義優先級。

語法規則是由上下文無關文法表示的,而上下文無關文法是由一組替換規則(又叫產生式)組成的,比如算術表達式的文法規則可以表達成下面這種形式:

add -> mul | add + mul
mul -> pri | mul * pri
pri -> Id | Num | Operator

pri表示基礎表達式,他可以推導成Id(標識符),Num(數字), Operator(操作符)

mul表示可以推導成一個基礎表達式或者是mul乘以pri

add表示可以推導成一個mul或者add 加上 mul

按這個規則我們來推導一下a + b * c.

優先級高的后推導,優先級低的先推薦。

嘗試將這個式子推薦成add,發現剛好符合要求add+mul

add+mul 推導成mul+mul

再推導成pri+mul

再推導成pri+mul*pri

再推導成pri+pri*pri

最后推導成pri+pri*pri

以上的推導是建立在你有一定的編譯器前端認識的基礎之上,在這之前你需要知道推導的左遞歸與結合性的問題。

Antlr已經幫我們處理好了左遞歸,我們可以放心的按左遞歸的規則來書寫。

至于結合性的問題,正如我上面提到的,a + b * c 不能推導成a + b 再乘以c,我們可能通過Antlr規則產生式的順序來確保結合性的正確。

上面說了很多都比較空洞, 接下來我們通過Antlr來實現我們的語法分析

grammar FlexDSLScript;
import FlexDSLLexer;

/// 表達式,按右邊產生式的順序來依次優先推導
expression:
 primary
 | dot = '.' expression
 | expression dot = '.' expression
 | '(' expression ')'
 | FOR Id IN Id
 | expression postfix = ('++' | '--')
 | prefix = ('++' | '--') expression
 | expression bop = ('*' | '/' | '%') expression
 | expression bop = ('+' | '-') expression
 | expression bop = ('<' | '<=' | '>' | '>=') expression
 | expression bop = ('==' | '!=') expression
 | expression bop = ('&&' | '||') expression
 | expression bop = '?' expression bop = ':' expression;

primary:
 Id
 | StringLiteral
 | IntLiteral
 | DoubleLiteral
 | TF = (True | False);

首先我們需要導入語法分析規則

我們定義了最基礎的表達未

primary, 他可以推導出Id(標簽符: 變量名稱),

StringLiteral(字符串字面量),

IntLiteral(整形字面量),

DoubleLiteral(浮點書字面量),

TF(true|false)

expression 通過順序定義了推導邏輯,優先級高的寫在前面,優先級低的寫后面 寫好規則文件之后我們來編譯一下

antlr4 FlexDSLScript.g4
javac *.java

編譯完成后運行

grun FlexDSLScript expression -gui

圖片

在終端里輸入這個表達式,然后按Alt+D(mac), Windows應該是Control+D,輸入一下結束符,

接下來java彈出一個對話框,直觀的展示了解析后的AST

圖片

通過遍歷這個AST我們就可以得到這個表達式最后的結果了。

下一節我們來實現語義分析,也就是對AST的遍歷求運算。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 語法
    +關注

    關注

    0

    文章

    44

    瀏覽量

    10063
  • ANTLR
    +關注

    關注

    0

    文章

    3

    瀏覽量

    5806
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Stanford編譯原理詳解

    第二部分的作業是語法分析,通過編寫cool.y(這個assignment的任務),利用bison將其自動生成語法分析LALR(1)的代碼。
    的頭像 發表于 10-25 10:47 ?828次閱讀
    Stanford編譯原理詳解

    #硬聲創作季 1.3.3 語法分析

    編譯原理語法與文法
    Mr_haohao
    發布于 :2022年09月01日 06:00:37

    關于antlr詞法分析器的使用

    剛剛接觸antlr詞法分析器只略看了些基本理論知識,關于做實例就完全不懂了,我想知道他需要什么樣的環境和軟件,以及軟件的下載地址.多謝各位了
    發表于 11-12 16:29

    postgreSQL命令的詞法分析語法分析

    PostgreSQL查詢SQL的語法分析(1)——詞法分析
    發表于 05-16 16:33

    Linux內核中GNU C擴展的一些常用C語言語法分析

    13.1 總結前面12節的課程,主要針對 Linux 內核中 GNU C 擴展的一些常用 C 語言語法進行了分析。GNU C 的這些擴展語法,主要用來完善 C 語言標準和編譯優化。而通過 C 標準
    發表于 12-14 06:29

    一個高效的語法分析器生成工具

    VPGE(Visual Parser Generation Environment)是一個可視化語法分析器集成開發環境,除了具有良好的界面和強大的調試功能,其LALR(1)分析器的生成速度達到并超過公認的分析器生成速度最快
    發表于 08-29 10:04 ?16次下載

    YACC在ATLAS語言語法分析中的沖突消解研究

    對使用YACC工具進行ATLAS語言語法分析過程中出現的大量沖突進行了詳細的分類討論與研究,給出了實現過程中出現的主要沖突類型及相應解決方案:文法符號的不斷自身循環產生
    發表于 09-08 15:30 ?0次下載

    編譯原理實踐環節模擬試題

    1.為以下文法構造遞歸下降語法分析程序,并能對輸入串進行語法分析。 S aBc|bAB A aAb|b B b 2.試寫出簡單的詞法分析程序,它能將源代碼按單詞類別(標識符、保留字、常數、特殊符)
    發表于 04-11 22:19 ?24次下載

    借助Lex和Yacc進行詞法語法分析

    實驗目的: 1.通過對實驗型程序設計語言C1的定義,掌握程序設計語言的基本語法和語義; 2.使用Lex及Yacc實現詞法分析語法分析;
    發表于 04-18 23:04 ?30次下載

    基于ANTLR的試卷識別和導入系統

    為了解決在線考試系統中手工錄入試題效率低下的問題,提出了一種基于ANTLR的自動化解決方案。該方案建立一個試卷識別器,把試卷內容作為源代碼,通過詞法、語法和語義分析來進
    發表于 04-27 10:54 ?0次下載
    基于<b class='flag-5'>ANTLR</b>的試卷識別和導入系統

    Java程序的工作原理是怎樣的

    javac編譯器運行的過程大致分為:詞法分析(Token流)、語法分析語法樹)、語義分析(注解語法樹),還有代碼生成器,根據注解
    發表于 03-07 15:47 ?1380次閱讀

    開源L2C編譯器前端語法分析器及驗證過程

    Jourdan等在其2012年發表的論文“ Validating Lr(1) Parsers”中提出了一種形式化驗證語法分析器的方法,并將其成功地應用于 Compcert編譯器(2.3以上版本
    發表于 05-19 10:55 ?5次下載

    Python程序語法元素分析資源下載

    Python程序語法元素分析資源下載
    發表于 08-09 09:23 ?2次下載

    重建AST

    利用antlr完成了語法分析之后,就需要進行語義分析了。
    的頭像 發表于 03-03 10:12 ?669次閱讀
    重建AST

    自頂向下的語法分析器—采用遞歸下降方法

    在之前已經通過手寫的方式實現了一個詞法分析器,現在,我將利用之前手寫的詞法分析器,使用遞歸下降的方式,實現一個簡單的語法分析器。
    的頭像 發表于 05-23 11:24 ?2297次閱讀
    自頂向下的<b class='flag-5'>語法分析</b>器—采用遞歸下降方法