JFlexとBYacc/Jの簡単なメモを勉強します。

3746 ワード

JFlexはThe Fast Lexical Analyser Generatorで、lex/flexのjavaバージョンで、JLexのアップグレードです。
ヘルプマニュアルの住所:http://www.jflex.de/manual.html 中国語のいくつかの資料: http://wenku.baidu.com/view/542645350b4c2e3f57276338.html
lex/flexのルールファイル(spec)の3つの部分は、1.声明/オプションです。2.モードと動作3.コードがコピーされました。
JFlexのルールファイルの3つの部分は:1.クラスの前のユーザーコード(flex 3と同じ)です。2.宣言/オプション3.モードと動作.順序が違います。
第二部分では、いくつかの重要なオプションの中から以下のように抜粋されています。また%implements%extensなどのコマンドがあります。  クラスのベースクラスと実装インターフェースなどのオプションを指定します。%{...クラスのコード...%}--クラスの中間コードにします。クラスメソッドやメンバー変数など、%function--yyyyyyxx()を呼び出す名前を指定します。デフォルトはyyyyyylex()の戻りタイプを指定します。この場合はEOFに-1.%type--指定yxycle(タイプ)を返します。EOFはnull.%debugに戻ります。%stsandlone--mainを生成する方法に使用できます。デバッグに使用します。%cup、%byacc--はカップ、byaccと組み合わせます。
=============================================================例:word countは、flexから改編(コードや構造の調整が必要)/*第一部:声明 package、import略 */ %% /* 第二部分: オプション、クラスのコード*/%class WordCount Lexer%function yyyylex%int%  /* クラスのコード*/  public int chars、wors、lineas;  public static void main(...)略%/*第三部分:ルールと動作 */ [a-zA-Z]  { 一致する単語print(ytext);++words…}           { 新行print(「NEWLINE」)/+….             { 他の任意の文字にマッチします。print(「OTHER CHAR:」+ytext();++…)
注意したいのは、ここのspecファイル構造はjflexの要求によって変更されます。最後にjavaファイルを作成して、テスト実行します。ポイント:%intは戻り値タイプを設定します。メール関数をコピーします。
 
================================================================例2:計算器
//first part*/package calc;
%%/*second parth*/%  public static void print(String){System.out.print(s)}
%int%debug
%%/*third part*/“+”     { print(「PLUS」)「-」     { print(「MINUS」)「*」     { print(「TIMES」)「/」     { print("DIVIDE")=[0-9]+  { print(「NUMBER:」+ytext()+「」;)      { print(「NEWLINE」)}[\t)   { /*space ignored*/}.       { print(「Mystry Char:」+ytext()+「)」;
wcと似ています。モデルが少し増えました。
方法論:  1.既存の例において、段階的に修正し、追加し、試験する。  2.他の人の工程で使用されたlex/flexファイルを改造する。
こぼれ話(八卦):lexは1975年にMike Leskと夏休み実習生のエリックSchmidtが編纂したので、後者は今です。    GoogleのCEO.
========================================================================================================================
%token NUMBER  /* token*/%type<dvd>expを定義します。  /* yyyyloval値の種類を指定できます。*/%begin second part:rules */ calclist:/*empty*/|calclist exp EOL...exp: exp'+'factor'-'factor…%/*third part:user code*/public static void main(){…}public int yyyyyyyyclex()/*接続jflexはここで実現されます。 */
作成ファイル使用:byaccj-J-Jpackage=call c-Jsemantic=double canc.y  ここでbyaccjはyacc.exe(Byacc/Jの実行可能ファイル)を指しています。  -Jpackage=calcはパッケージ名を指定します。  -Jsematic=doubleは意味値の種類をdoubleと表現します。
Yylexでは、Paserで生成されたNUMBERなどのtoken値を参照する必要があり、parserにyyyyloval値を設定するためには、YylexにPaserの参照が必要であり、構造において使いやすい方法を与える必要がある。
 
=========================================================================================================
Antファイルで自動的にcupが完成し、jflexでコンパイルされたセグメントは、参考用として使用されます。
	<property name="CUPJar" value="lib/java-cup-11a.jar" ></property>
	<property name="JFlexJar" value="lib/JFlex.jar"></property>
	<!--       cup,jflex -->
	<taskdef name="cup" classname="java_cup.anttask.CUPTask"
	  classpath="${CUPJar}" />
	<taskdef name="jflex" classname="JFlex.anttask.JFlexTask"
		classpath="${JFlexJar}" />
	
	<!--    cup    'ycalc.cup' -->
	<target name="ycalc_cup" >
		<cup srcfile="src/cup/ycalc.cup"
			destdir="src/cup"
			interface="true"
			package="cup"
			parser="Parser"
			symbols="sym"
		/>
	</target>
	<!--    jflex    'lcalc.flex' -->
	<target name="lcalc_flex">
		<jflex file="src/cup/lcalc.flex" dot="true"
			/>
	</target>