国产chinesehdxxxx老太婆,办公室玩弄爆乳女秘hd,扒开腿狂躁女人爽出白浆 ,丁香婷婷激情俺也去俺来也,ww国产内射精品后入国产

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

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

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

語法分析-Antlr

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

掃碼添加小助手

加入工程師交流群

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

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

我們先來看一個(gè)簡單的例子:

a + b * c

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

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

語法規(guī)則是由上下文無關(guān)文法表示的,而上下文無關(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)識符),Num(數(shù)字), Operator(操作符)

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

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

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

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

嘗試將這個(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)識的基礎(chǔ)之上,在這之前你需要知道推導(dǎo)的左遞歸與結(jié)合性的問題。

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

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

上面說了很多都比較空洞, 接下來我們通過Antlr來實(shí)現(xiàn)我們的語法分析

grammar FlexDSLScript;
import FlexDSLLexer;

/// 表達(dá)式,按右邊產(chǎn)生式的順序來依次優(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)入語法分析規(guī)則

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

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

StringLiteral(字符串字面量),

IntLiteral(整形字面量),

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

TF(true|false)

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

antlr4 FlexDSLScript.g4
javac *.java

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

grun FlexDSLScript expression -gui

圖片

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

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

圖片

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

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

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

    關(guān)注

    0

    文章

    44

    瀏覽量

    10165
  • ANTLR
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Stanford編譯原理詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    開源L2C編譯器前端語法分析器及驗(yàn)證過程

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

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

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

    重建AST

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

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

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