chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

語(yǔ)法分析-Antlr

汽車(chē)電子技術(shù) ? 來(lái)源:程序猿搬磚 ? 作者: 壞人 ? 2023-03-03 10:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一節(jié),我們通過(guò)Antlr快速的落地實(shí)現(xiàn)了Token的解析,這一節(jié)我們還是基于Antlr來(lái)實(shí)現(xiàn)語(yǔ)法的解析。

語(yǔ)法分析相對(duì)來(lái)講就復(fù)雜多了,我們需要對(duì)Token進(jìn)行推導(dǎo)與組合,生成我們想要表達(dá)的式子。

我們先來(lái)看一個(gè)簡(jiǎn)單的例子:

a + b * c

這個(gè)看上去很簡(jiǎn)單的表達(dá)式,我們最終想要得到的結(jié)果是b * c 再與 a相加,而不是a + b再乘以 c。

這里就涉及到一個(gè)優(yōu)先級(jí)的問(wèn)題,Antlr支持通過(guò)右邊產(chǎn)生式的順序來(lái)定義優(yōu)先級(jí)。

語(yǔ)法規(guī)則是由上下文無(wú)關(guān)文法表示的,而上下文無(wú)關(guān)文法是由一組替換規(guī)則(又叫產(chǎn)生式)組成的,比如算術(shù)表達(dá)式的文法規(guī)則可以表達(dá)成下面這種形式:

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

pri表示基礎(chǔ)表達(dá)式,他可以推導(dǎo)成Id(標(biāo)識(shí)符),Num(數(shù)字), Operator(操作符)

mul表示可以推導(dǎo)成一個(gè)基礎(chǔ)表達(dá)式或者是mul乘以pri

add表示可以推導(dǎo)成一個(gè)mul或者add 加上 mul

按這個(gè)規(guī)則我們來(lái)推導(dǎo)一下a + b * c.

優(yōu)先級(jí)高的后推導(dǎo),優(yōu)先級(jí)低的先推薦。

嘗試將這個(gè)式子推薦成add,發(fā)現(xiàn)剛好符合要求add+mul

add+mul 推導(dǎo)成mul+mul

再推導(dǎo)成pri+mul

再推導(dǎo)成pri+mul*pri

再推導(dǎo)成pri+pri*pri

最后推導(dǎo)成pri+pri*pri

以上的推導(dǎo)是建立在你有一定的編譯器前端認(rèn)識(shí)的基礎(chǔ)之上,在這之前你需要知道推導(dǎo)的左遞歸與結(jié)合性的問(wèn)題。

Antlr已經(jīng)幫我們處理好了左遞歸,我們可以放心的按左遞歸的規(guī)則來(lái)書(shū)寫(xiě)。

至于結(jié)合性的問(wèn)題,正如我上面提到的,a + b * c 不能推導(dǎo)成a + b 再乘以c,我們可能通過(guò)Antlr規(guī)則產(chǎn)生式的順序來(lái)確保結(jié)合性的正確。

上面說(shuō)了很多都比較空洞, 接下來(lái)我們通過(guò)Antlr來(lái)實(shí)現(xiàn)我們的語(yǔ)法分析

grammar FlexDSLScript;
import FlexDSLLexer;

/// 表達(dá)式,按右邊產(chǎn)生式的順序來(lái)依次優(yōu)先推導(dǎo)
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);

首先我們需要導(dǎo)入語(yǔ)法分析規(guī)則

我們定義了最基礎(chǔ)的表達(dá)未

primary, 他可以推導(dǎo)出Id(標(biāo)簽符: 變量名稱),

StringLiteral(字符串字面量),

IntLiteral(整形字面量),

DoubleLiteral(浮點(diǎn)書(shū)字面量),

TF(true|false)

expression 通過(guò)順序定義了推導(dǎo)邏輯,優(yōu)先級(jí)高的寫(xiě)在前面,優(yōu)先級(jí)低的寫(xiě)后面 寫(xiě)好規(guī)則文件之后我們來(lái)編譯一下

antlr4 FlexDSLScript.g4
javac *.java

編譯完成后運(yùn)行

grun FlexDSLScript expression -gui

圖片

在終端里輸入這個(gè)表達(dá)式,然后按Alt+D(mac), Windows應(yīng)該是Control+D,輸入一下結(jié)束符,

接下來(lái)java彈出一個(gè)對(duì)話框,直觀的展示了解析后的AST

圖片

通過(guò)遍歷這個(gè)AST我們就可以得到這個(gè)表達(dá)式最后的結(jié)果了。

下一節(jié)我們來(lái)實(shí)現(xiàn)語(yǔ)義分析,也就是對(duì)AST的遍歷求運(yùn)算。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 語(yǔ)法
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    10126
  • ANTLR
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5822
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Stanford編譯原理詳解

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

    #硬聲創(chuàng)作季 1.3.3 語(yǔ)法分析

    編譯原理語(yǔ)法與文法
    Mr_haohao
    發(fā)布于 :2022年09月01日 06:00:37

    關(guān)于antlr詞法分析器的使用

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

    postgreSQL命令的詞法分析語(yǔ)法分析

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

    Linux內(nèi)核中GNU C擴(kuò)展的一些常用C語(yǔ)言語(yǔ)法分析

    13.1 總結(jié)前面12節(jié)的課程,主要針對(duì) Linux 內(nèi)核中 GNU C 擴(kuò)展的一些常用 C 語(yǔ)言語(yǔ)法進(jìn)行了分析。GNU C 的這些擴(kuò)展語(yǔ)法,主要用來(lái)完善 C 語(yǔ)言標(biāo)準(zhǔn)和編譯優(yōu)化。而通過(guò) C 標(biāo)準(zhǔn)
    發(fā)表于 12-14 06:29

    一個(gè)高效的語(yǔ)法分析器生成工具

    VPGE(Visual Parser Generation Environment)是一個(gè)可視化語(yǔ)法分析器集成開(kāi)發(fā)環(huán)境,除了具有良好的界面和強(qiáng)大的調(diào)試功能,其LALR(1)分析器的生成速度達(dá)到并超過(guò)公認(rèn)的分析器生成速度最快
    發(fā)表于 08-29 10:04 ?16次下載

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

    對(duì)使用YACC工具進(jìn)行ATLAS語(yǔ)言語(yǔ)法分析過(guò)程中出現(xiàn)的大量沖突進(jìn)行了詳細(xì)的分類(lèi)討論與研究,給出了實(shí)現(xiàn)過(guò)程中出現(xiàn)的主要沖突類(lèi)型及相應(yīng)解決方案:文法符號(hào)的不斷自身循環(huán)產(chǎn)生
    發(fā)表于 09-08 15:30 ?0次下載

    編譯原理實(shí)踐環(huán)節(jié)模擬試題

    1.為以下文法構(gòu)造遞歸下降語(yǔ)法分析程序,并能對(duì)輸入串進(jìn)行語(yǔ)法分析。 S aBc|bAB A aAb|b B b 2.試寫(xiě)出簡(jiǎn)單的詞法分析程序,它能將源代碼按單詞類(lèi)別(標(biāo)識(shí)符、保留字、常數(shù)、特殊符)
    發(fā)表于 04-11 22:19 ?24次下載

    借助Lex和Yacc進(jìn)行詞法語(yǔ)法分析

    實(shí)驗(yàn)?zāi)康模?1.通過(guò)對(duì)實(shí)驗(yàn)型程序設(shè)計(jì)語(yǔ)言C1的定義,掌握程序設(shè)計(jì)語(yǔ)言的基本語(yǔ)法和語(yǔ)義; 2.使用Lex及Yacc實(shí)現(xiàn)詞法分析語(yǔ)法分析
    發(fā)表于 04-18 23:04 ?30次下載

    基于ANTLR的試卷識(shí)別和導(dǎo)入系統(tǒng)

    為了解決在線考試系統(tǒng)中手工錄入試題效率低下的問(wèn)題,提出了一種基于ANTLR的自動(dòng)化解決方案。該方案建立一個(gè)試卷識(shí)別器,把試卷內(nèi)容作為源代碼,通過(guò)詞法、語(yǔ)法和語(yǔ)義分析來(lái)進(jìn)
    發(fā)表于 04-27 10:54 ?0次下載
    基于<b class='flag-5'>ANTLR</b>的試卷識(shí)別和導(dǎo)入系統(tǒng)

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

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

    開(kāi)源L2C編譯器前端語(yǔ)法分析器及驗(yàn)證過(guò)程

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

    Python程序語(yǔ)法元素分析資源下載

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

    重建AST

    利用antlr完成了語(yǔ)法分析之后,就需要進(jìn)行語(yǔ)義分析了。
    的頭像 發(fā)表于 03-03 10:12 ?737次閱讀
    重建AST

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

    在之前已經(jīng)通過(guò)手寫(xiě)的方式實(shí)現(xiàn)了一個(gè)詞法分析器,現(xiàn)在,我將利用之前手寫(xiě)的詞法分析器,使用遞歸下降的方式,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的語(yǔ)法分析器。
    的頭像 發(fā)表于 05-23 11:24 ?2391次閱讀
    自頂向下的<b class='flag-5'>語(yǔ)法分析</b>器—采用遞歸下降方法