2016-11-24 14 views
0

Javaソースコード盗聴検出器のレクサーを書く必要があります。 ここに私が達成したいものがあります。"Class brackets"と "Method bracket"を区別するJFlex Lexer

//Java code         Tokens: 
public class Count {       Begin Class 
    public static void main(String[] args) Var Def, Begin Method 
     throws java.io.IOException { 
     int count = 0;       Var Def, Assign 
     while (System.in.read() != -1)   Apply, Begin While 
     count++;        Assign, End While 
     System.out.println(count+" chars."); Apply 

    }           End Method 
}            End Class 

私はJflexがレクサーを生成するための正しいツールだと思います。しかし、いくつかの例を見てから。クラス括弧とメソッド括弧を区別する方法が見つかりません。私が見つけたほとんどのトークナイザは、それらを同じトークンとして認識しています。また、メソッドの適用を変数識別子から区別するにはどうすればよいですか?

答えて

4

大括弧と大括弧を区別する方法が見つかりません。

字句的に違いはありません。 "{".equals("{")。あなたがそれらを区別する方法は、パーサーのコンテキストです。レクサーはその区別をすることはできません。

はまた、どのように私は、メソッドを区別しないあなたがいない、レクサーでは、変数の識別子

から適用されます。識別子は識別子です。 "f(x)"から生成されたトークンストリームはIdentifier, OpeningParenthesis, Identifier, ClosingParenthesisでなければなりません。

パーサでは、ファンクション名が認識されます。ファンクション名には、開始括弧が続きますが、それはパーサーのものであり、レクサーのものではありません。

+0

ご理解いただきありがとうございます。自分のやり方でコードを解析するための修飾子となる既存のサンプルコードまたはツールはありますか? –

+0

@ Y.ZhaoさまざまなパーサーコンビネータのJava文法の例がありますが、JFlexと一緒に使うコンビネーションコンビネーションには現在のものを見つけることができませんでした。私は、JFlex + CupやJFlex + BYaccJや人気のある組み合わせはもう考えていません。あなたがJFlexと結婚していない場合は、Antlrの現在のJava文法を簡単に見つけることができます。 – sepp2k

関連する問題