compiler

3294 ワード

1、文法分析器生成器javacc.本明細書のjavacc[1]は5.0バージョンです.
Main.JAvaとMiniJavaLexerjj
public class Main {
   
   public static void main(String [] args) {
      try {
         new MiniJavaParser(System.in).Goal();
         System.out.println("Lexical analysis successfull");
      }
      catch (ParseException e) {
         System.out.println("Lexer Error : 
"+ e.toString());       }    } }
options {
  JAVA_UNICODE_ESCAPE = true;
}

PARSER_BEGIN(MiniJavaParser)
  public class MiniJavaParser {}
PARSER_END(MiniJavaParser)
void Goal() :
{}
{
  ( MiniJavaToken() )*
  <EOF>
}

void MiniJavaToken():
{}
{
  "class"  |  "<IDENTIFIER>" | "{" | "public" | "static" | "void" |
  "main" | "(" | "String"  | "[" | "]" | ")" | "}" | "extends" | ";"
  | "return" | "," | "int" | "boolean" | "=" | "if" | "else" | "while"
  | "System.out.println" | "&&" | "<" | "+" | "-" | "*" | "." |
  "length" | "<INTEGER_LITERAL>" | "true" | "false" | "this" | "new" |
  "!"
}

SKIP:{
    <("\r" | "\r
" | "
")> | " " | "\t" | "
" }

$ javacc MiniJavaLexer.jj    $ javac Main.java  $java Main +params...テスト後にTokenの規則を満たす. 
2、文法分析器
2.0有限自動機は括弧に一致しない(N状態の有限自動機だけがNより長いネスト括弧を記憶できないため)ため、文法を用いて文法構造を定義し、正規表現で文法構造を定義し、実際には文法を用いて文法構造を定義することもよくある.
2.1正規表現ではなくコンテキスト依存文法を使用し、変換文法を使用して二義性を回避します.
2.2予測解析、再帰的降下は、各サブ式の最初の終端が選択生成式に十分な情報を提供する文法に限られる.->first+followセット.
2.3 first+follow集合計算法,予測分析表,再帰的降下分析器,LL(K).
    X->Y1Y2Y3...Yk
first(z)=z,zは終端
for i in [1-k]:
    if Y[1...(t-1)]=null: first[Y]=first(Yt)
    if Y[(t+1)...k]=null: follow(Yt)=follow(Yt)+follow(Y)
    if Y(Y[(t+1)...(v-1)])=null: follow(Yt)=follow(Yt)+first(Yv) 
first+followセットを計算すると,予測解析テーブルが得られ,再帰的降下解析器が完了する.文字ストリームを受け入れると、予測解析テーブルに基づいて構文解析ツリーを展開できます.1文字が複数の予測ブランチに対応する方法については,二義的文法が現れる.複数の予測ブランチを含まない称述LL(1)文法.左再帰が存在する文法はLL(1)ではない.再帰的降下(予測)アナライザは左から右に分析されるため、予測アナライザは左再帰と共通左因子の影響を受け、左再帰を右再帰に変換して共通左因子を抽出することで影響を除去することができ、この場合もif then elseの二義的な問題が発生する可能性があり、最近のif-elseの最近のマッチングを保証することでよい.再帰的降下アナライザがエラーの文字を受け入れるとエラーが発生し、エラーリカバリ:followコレクション要素と一致するまでエラー記号をスキップし続けます.
2.4 LR(k)は、スタックを見てk個の入力記号を前に見ることによって次の方向を決定する.k>1は、テーブルが膨大すぎてコンパイルに適していないため、k=1は多くの言語のコンパイル要件を満たすことができる.LR(0)スタックが符号を前に見なくて済むだけで,ルールへの移行操作を決定できる.移行規約操作が競合する場合があり、follow集合によりテーブルの移行規約操作、すなわちSLR文法が決定される.LR(1)は、LR(0)よりもファンテーブルが類似しているが、プロジェクトの概念はより完全である.LR(1)は順方向tokenを1つ増やしたため、プロジェクト状態が多くなり、テーブルが大きくなり、状態をマージすることでLR(1)の規模を低減する.これをLALR(1)文法と呼び、LR(1)はシフトルール競合を含まないが、LALR(1)は含まれる可能性があるが、LALA(1)が占有するメモリはLR(1)よりも小さいため、LALR(1)はより標準的である.
2.5オブジェクト向けスタイルと構文は、解釈スタイルとは独立しています(訪問者モード)
新しいスタイルに新しいタイプを追加するには、クラスを1つ追加するだけで、解釈を追加するには、クラスごとに新しい方法を追加する必要があります.アクセス者モードでは、既存のクラスをコンパイルする必要はありません.
f
[0].http://www.cambridge.org/us/catalogue/catalogue.asp?isbn=9780521820608&ss=res
[1].javacc :https://www.ibm.com/developerworks/cn/xml/x-javacc/part1/
続きを待つ