JavaCC的簡介與使用說明
一、JavaCC
JavaCC是java的compiler compiler。JavaCC是LL解析器生成器,可处理的语法范围比较狭窄,但支持无限长的token超前扫描。
安装过程:
我是从github上down下来的zip压缩包,然后安装了下ant, 然后通过ant安装的javacc
1. 首先下载下来ant的源码,然后tar -zvxf apache-ant....tag.gz 解压缩,然后可以在解压出来的bin目录中看到ant的可执行文件
2. 从github下载javacc, 进入解压缩的目录执行xxxxxx/ant。 然后会在target 目录中看到javacc.jar 包
3. 这个时候可以通过如下方法将jar包做成一个可执行文件:
首先创建一个shell脚本:
#!/bin/shMYSELF=`which "$0" 2>/dev/null` [ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"java=javaif test -n "$JAVA_HOME"; thenjava="$JAVA_HOME/bin/java"fiexec "$java" $java_args -cp $MYSELF "$@"exit 1
命名为stub.sh, 然后在jar包的所在目录执行: cat stub.sh javacc.jar > javacc && chmod +x javacc。 这样一个可执行文件就有了,不过在解析.jj文件时需要带一个javacc的参数,像这样: javacc javacc Adder.jj
二、语法描述文件
1、简介
JavaCC的语法描述文件是扩展名为.jj的文件,一般情况下,语法描述文件的内容采用如下形式
options { JavaCC的选项 } PARSER_BEGIN(解析器类名)package 包名;import 库名;public class 解析器类名 { 任意的Java代码 } PARSER_END(解析器类名) 扫描器的描述 解析器的描述
JavaCC和java一样将解析器的内容定义在单个类中,因此会在PARSER_BEGIN和PARSER_END之间描述这个类的相关内容。
2、Example
如下代码是一个解析正整数加法运算并进行计算的解析器的语法描述文件。
options {STATIC = false; } PARSER_BEGIN(Adder)import java.io.*class Adder {public static void main(String[] args) {for (String arg : args) {try { System.out.println(evaluate(arg)); } catch (ParseException ex) { System.err.println(ex.getMessage()); } } } public static long evaluate(String src) throws ParseException { Reader reader = new StringReader(src);return new Adder(reader).expr(); } } PARSER_END(Adder) SKIP: { <[" ", "\t", "\r", "\n"]> } TOKEN: { <INTEGER: (["0"-"9"])+> }long expr(): { Token x, y } { x=<INTEGER> "+" y=<INTEGER> <EOF> {return Long.parseLong(x.image) + Long.parseLong(y.image); } }
options块中将STATIC选项设置为false, 将该选项设置为true的话JavaCC生成的所有成员及方法都将被定义为static,若将STATIC设置为true则所生成的解析器无法在多线程环境下使用,因此该选项总是被设置为false。(STATIC的默认值为true)
从PARSER_BEING(Adder)到PARSER_END(Adder)是解析器类的定义。解析器类中需要定义的成员和方法也写在这里。为了实现即使只有Adder类也能够运行,这里定义了main函数。
之后的SKIP和TOKEN部分定义了扫描器。SKIP表示要跳过空格、制表符(tab)和换行符。TOKEN表示扫描整数字符并生成token。
long expr...开始到最后的部分定义了狭义的解析器。这部分解析token序列并执行某些操作。
3、运行JavaCC
要用JavaCC来处理Adder.jj(图中是demo1.jj),需要使用如下javacc命令
运行如上命令会生成Adder.java和其他辅助类。
要编译生成的Adder.java,只需要javac命令即可:
这样就生成了Adder.class文件。Adder类是从命令行参数获取计算式并进行计算的,因此可以如下这样从命令行输入计算式并执行
三、启动JavaCC生成的解析器
现在解析一下main函数的代码。 main函数将所有命令行参数的字符串作为计算对象的算式,依次用evaluate方法进行计算。
evaluate方法中生成了Adder类的对象实例 。并让Adder对象来计算(解析)参数字符串src。
要运行JavaCC生成的解析器类,需要下面2个步骤:
生成解析器类的对象实例
用生成的对象调用和需要解析的语句同名的方法
第1点: JavaCC4.0生成的解析器中默认定义有如下四种类型的构造函数。
Parser(InputStream s)
Parser(InputStream s, String encoding)
Parser(Reader r)
Parser(x x x x TokenManager tm)
第1种的构造函数是通过传入InputStream对象来构造解析的。这个构造函数无法设定输入字符串的编码,因此无法处理中文字符等。
而地2种的构造函数除了InputStream对象外,还可以设置输入字符串的编码来生成解析器。但如果要解析中文字符串或注释的话,就必须使用第2种/3种构造函数。
第3种的构造函数用于解析Reader对象所读入的内容。
第4种是将扫描器作为参数传入。
解析器生成后,用这个实例调用和需要解析的语法同名的方法。这里调用Adder对象的expr方法,接回开始解析,解析正常结束后会返回语义值。
四、中文的处理
要使JavaCC能够处理中文首先需要将语法描述文件的options快的UNICODE_INPUT选项设置为true:
options {STATUS = false;DEBUG_PARSER = true;UNICODE_PARSER = true;JDK_VERSION = "1.5"; }
这样就会先将输入的字符转换成UNICODE后再进行处理。UNICODE_INPUT选项为false时只能处理ASCII范围的字符。
另外还需要使用第2/3种构造方法为输入的字符串设置适当的编码。
以上是JavaCC的簡介與使用說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Diffusion不僅可以更好地模仿,而且可以進行「創作」。擴散模型(DiffusionModel)是一種影像生成模型。與先前AI領域大名鼎鼎的GAN、VAE等演算法,擴散模型另闢蹊徑,其主要想法是先對影像增加噪聲,再逐步去噪的過程。其中如何去噪還原原影像是演算法的核心部分。最終演算法能夠從一張隨機的雜訊影像中產生影像。近年來,生成式AI的驚人成長將文字轉換為圖像生成、視訊生成等領域的許多令人興奮的應用提供了支援。這些生成工具背後的基本原理是擴散的概念,這是一種特殊的取樣機制,克服了先前的方法中被

Kimi:一句話,十幾秒鐘,一份PPT就新鮮出爐了。 PPT這玩意兒,可太招人煩了!開個碰頭會,要有PPT;寫個週報,要做PPT;拉個投資,要展示PPT;就連控訴出軌,都得發個PPT。大學比較像是學了個PPT專業,上課看PPT,下課做PPT。或許,37年前丹尼斯・奧斯汀發明PPT時也沒想到,有一天PPT竟然如此氾濫成災。嗎嘍們做PPT的苦逼經歷,說起來都是淚。 「一份二十多頁的PPT花了三個月,改了幾十遍,看到PPT都想吐」;「最巔峰的時候,一天做了五個PPT,連呼吸都是PPT」;「臨時開個會,都要做個

北京時間6月20日凌晨,在西雅圖舉辦的國際電腦視覺頂會CVPR2024正式公佈了最佳論文等獎項。今年共有10篇論文獲獎,其中2篇最佳論文,2篇最佳學生論文,另外還有2篇最佳論文提名和4篇最佳學生論文提名。電腦視覺(CV)領域的頂級會議是CVPR,每年都會吸引大量研究機構和高校參會。根據統計,今年共提交了11532份論文,2719篇被接收,錄取率為23.6%。根據佐治亞理工學院對CVPR2024的數據統計分析,從研究主題來看,論文數量最多的是圖像和視頻合成與生成(Imageandvideosyn

快速入門PyCharm社群版:詳細安裝教學全解析導言:PyCharm是一個功能強大的Python整合開發環境(IDE),它提供了一套全面的工具,可以幫助開發人員更有效率地編寫Python程式碼。本文將詳細介紹如何安裝PyCharm社群版,並提供具體的程式碼範例,幫助初學者快速入門。第一步:下載和安裝PyCharm社群版要使用PyCharm,首先需要從其官方網站上下

我們知道LLM是在大規模電腦叢集上使用海量資料訓練得到的,本站曾介紹過不少用於輔助和改進LLM訓練流程的方法和技術。而今天,我們要分享的是一篇深入技術底層的文章,介紹如何將一堆連作業系統也沒有的「裸機」變成用來訓練LLM的電腦叢集。這篇文章來自於AI新創公司Imbue,該公司致力於透過理解機器的思維方式來實現通用智慧。當然,將一堆連作業系統也沒有的「裸機」變成用於訓練LLM的電腦叢集並不是一個輕鬆的過程,充滿了探索和試錯,但Imbue最終成功訓練了一個700億參數的LLM,並在此過程中積累

機器之能報道編輯:楊文以大模型、AIGC為代表的人工智慧浪潮已經在悄悄改變我們生活及工作方式,但絕大部分人依然不知道該如何使用。因此,我們推出了「AI在用」專欄,透過直覺、有趣且簡潔的人工智慧使用案例,來具體介紹AI使用方法,並激發大家思考。我們也歡迎讀者投稿親自實踐的創新用例。影片連結:https://mp.weixin.qq.com/s/2hX_i7li3RqdE4u016yGhQ最近,獨居女孩的生活Vlog在小紅書上走紅。一個插畫風格的動畫,再配上幾句治癒系文案,短短幾天就能輕鬆狂攬上

標題:技術入門者必看:C語言和Python難易度解析,需要具體程式碼範例在當今數位化時代,程式設計技術已成為一項越來越重要的能力。無論是想要從事軟體開發、數據分析、人工智慧等領域,還是僅僅出於興趣學習編程,選擇一門合適的程式語言是第一步。而在眾多程式語言中,C語言和Python作為兩種廣泛應用的程式語言,各有其特色。本文將對C語言和Python的難易度進行解析

C語言作為一門廣泛應用的程式語言,對於想從事電腦程式設計的人來說是必學的基礎語言之一。然而,對於初學者來說,學習新的程式語言可能會有些困難,尤其是缺乏相關的學習工具和教材。在本文中,我將介紹五款幫助初學者入門C語言的程式設計軟體,幫助你快速上手。第一款程式軟體是Code::Blocks。 Code::Blocks是一個免費的開源整合開發環境(IDE),適用於
