上一節,我們通過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
發布評論請先 登錄

關于antlr詞法分析器的使用
Linux內核中GNU C擴展的一些常用C語言語法分析
一個高效的語法分析器生成工具
YACC在ATLAS語言語法分析中的沖突消解研究
編譯原理實踐環節模擬試題
借助Lex和Yacc進行詞法語法分析
基于ANTLR的試卷識別和導入系統

評論