Antlr语法
// 1.注釋
/**
* 注釋有 單行,多行,Javadoc注釋 三種
*/
// 語法聲明,關鍵字 grammar
// 不帶前綴的語法聲明是混合語法,可以同時包含詞法規則和文法規則
// 若要創建一份只允許文法規則出現的語法,使用聲明 parser grammar Name; 純詞法的語法聲明,使用 lexer grammar Name;grammar ZC;
/*
多行注釋
*/// 2.標識符
// 詞法符號名 和 詞法規則名 以 大寫字母開頭
// 文法規則 以 小寫字母開頭
// 首字母之后的字符可以是大小寫字符、數字和下劃線// 文法規則名
// expr 是 文法規則名
// : 表示后面是具體的文法規則
// 這個文法由 ID 詞法 或 STRING 詞法組成
expr : ID | STRING | ;// 3 文法規則
// 3.1 語法分析器由一系列文法規則組成,這些規則既可以位于文法語法中,也可以位于混合語法中
// 規則中可以包含由|分隔的備選分支。
stat : retstat | 'break' ';' | 'continue' ';';
retstat : ID;// 3.2 備選分支是一組可以為空的規則元素列表。例如,下列規則中的空備選分支使得整條規則成為了可選的
stat2 : retstat | ;// 3.3 備選分支的標簽
// 可以使用#給最外層的備選分支添加標簽,以獲得更加精確的語法分析器監聽器事件
// 一條規則中的備選分支要么全部帶上標簽,要么全部不帶標簽
// ANTLR為每個標簽生成一個規則上下文類
stat3 : 'return' e ';' # Return| 'break' ';' # Break;
e : e '*' e # Mult| e '+' e # Add| INT # Int;// 4.規則元素
// 規則元素指明了語法分析器在特定的時間需要完成的任務
// 規則元素可以是一條規則、一個詞法符號 或者 一個字符串常量
// T 匹配詞法符號T,詞法符號以大寫字母開頭
// 'str' 匹配字符串常量
// r 匹配規則r,像函數一樣調用該規則,文法規則以小寫字母開頭
// r[<<args>>] 匹配r,并像函數調用一樣傳入一組參數
// {<<action>>} 在備選元素之后,后一個備選元素之前執行的代碼動作.
// {<<p>>}? 執行語義判定<<p>>.
// . 匹配任意除文件結束符之外的語法符號.
// ~(INT|ID)匹配除INT或ID之外的任意詞法符號// 5.子規則
// 一條規則可以包含稱為子規則的備選分支塊
// 子規則和規則相似,只是缺少名字并被包裹在圓括號內。在子規則的括號內,可以包含一個或者多個備選分支
// 存在四種類型的子規則(其中x、y、z代表語法元素)
// (x|y|z) 匹配該子規則內的任意備選分支 一次
// (x|y|z)? 匹配該子規則內的任意備選分支 一次 或 不匹配任何東西
// (x|y|z)* 匹配該子規則內的任意備選分支 0~多次
// (x|y|z)+ 匹配該子規則內的任意備選分支 1~多次
// 在子規則僅包含一個備選分支時,可以忽略子規則兩側的括號// 6.捕獲異常
// 當在一條規則中發生語法錯誤時,ANTLR會捕獲該異常,報告錯誤,并試圖從中恢復(可能通過消費更多的詞法符號來完成此過程),然后從規則中返回。
// 每條規則都包裹在一個try/catch/finally語句中// 7.規則屬性定義
// 與規則和動作相關的語法元素。規則可以像編程語言中的函數一樣,包含參數、返回值以及局部變量
// ANTLR會將你定義的所有變量收集起來并存儲到規則上下文對象中// 8.起始規則和文件結束符// 詞法符號 和 詞法規則名
// 詞法的語法 由 詞法規則組成,并且可被分解為多個模式
// 詞法規則的定義方式和文法規則非常相似,除了一些例外:詞法規則不能包含參數、返回值或者局部變量。
// 詞法規則名必須以大寫字母開頭,以和文法規則名區分開。// ID 詞法 表示: 只要不是 逗號 \n \t 中的一個字符就行
// 1.詞法模式
// 詞法模式 允許你將詞法規則按照上下文分組
// 2.詞法規則元素
// 詞法規則元素總結
// 'str' 匹配指定的字符或字符序列,如'while'或'='
// [char set]匹配字符集中的一個字符.如 [x-y]從x到y的字符集合(包含x和y). \n,\r,\b,\t,\,-, Unicode字符.
// 3.遞歸詞法規則
// ANTLR詞法規則可以是遞歸的ID : ~[,\n\r"]+ ;
// STRING詞法
STRING : '"' ('""'|~'"')* '"' ;
INT: '1';// antlr關鍵字: import、fragment、lexer、parser、grammar、returns、locals、throws、catch、finally、mode、options、tokens// 1.語法導入
// 語法導入允許你將語法分解成可復用的邏輯單元
// 一個語法會從其導入的語法中繼承所有的規則、詞法符號聲明和具名的動作
// 位于“主語法”中的規則將會覆蓋其導入的語法中的規則,以此來實現繼承機制
// 可以將import看作是一種智能的、不會引入本文件中已經定義過的規則的引入語句(include statement)
// 在處理一份主語法的過程中,ANTLR工具將所有被導入的語法加載到一起,然后將其中的規則、詞法符號類型以及具名動作合并到主語法中// 2.詞法符號聲明
// tokens區域存在的意義在于,它定義了一份語法所需,但卻未在本語法中列出對應規則的詞法符號// 文法規則
// 語法分析器由一系列文法規則組成,這些規則既可以位于文法語法中,也可以位于混合語法中
// Java程序通過調用ANTLR自動生成的、與預期的起始規則相對應的函數來啟動語法分析器
// 規則最基本的形式是規則名后面緊接著一個備選分支,然后是一個分號
expr2 : ID | STRING | ;
總結
- 上一篇: MarkdownPad 2 激活方法与图
- 下一篇: c语言指针课堂教学设计,C语言程序设计