3

言語を一連のトークンに変換する字句解析器を作成する割り当てがあります。私は java.util.regex を使用してさまざまなトークンを見つける文字列を調べています。それらを配列に入れ、それを使用してそれぞれのトークンを割り当てます。これが私のプログラムの一部です:

public static void main(String args[]) throws FileNotFoundException, IOException{

        String[] symbols = {"+","-","*","/","<","<=",">",">=","==","!=","=",";",",",".","(",")","[","]","{","}","/*","*/","//"};
        String[] input;
        FileInputStream fstream = new FileInputStream("src\\testCode.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        StringBuilder sb = new StringBuilder();
        String s;
        String ret = "";
        while((s = br.readLine()) != null){
            sb.append(s);
        }

        ret = sb.toString();

        input = regexChecker("regex goes here",ret);

        for (int i = 0; i < input.length; i++) {
            System.out.println(input[i]);

        }
        System.out.println(input.length);
        in.close();       
    }  

public static String[] regexChecker(String theRegex, String str2Check){
         List<String> allMatches = new ArrayList<String>();
        Pattern checkRegex = Pattern.compile(theRegex);
        Matcher regexMatcher = checkRegex.matcher(str2Check);

        while(regexMatcher.find()){
            //regexInput = new String[regexMatcher.group().length()];
            allMatches.add(regexMatcher.group());
        }
        String[] regexInput = allMatches.toArray(new String[allMatches.size()]);

        return regexInput;
    }

私の質問は次のとおりです:この言語を分離できる正規表現はありますか?または、正規表現を1つだけ使用しようとして、割り当てをすべて間違っていますか? 字句の規則の一部は次のとおりです。識別子は大文字またはアンダースコアで始まり、任意の単語文字が続きます。コメント行とブロックを使用できます。数値は、10 進数表記の符号なし整数または実数です。int、double、if などのキーワードと、*、/、+ などの特殊記号があります。

個々の規則ごとに正規表現を作成できますが、プログラムが必要とするように、それらを組み合わせて1つにする方法がわかりません。

また(?://.*)|(/\\*(?:.|[\\n\\r])*?\\*/)、コメントの正規表現として使用していますが、コメント行では機能しないようで、コメント ブロックだけです。ファイルを 1 行の文字列に読み込む方法が原因でしょうか?

4

2 に答える 2

0

を使用できる場合もありますjava.util.StringTokenizerが、多くの場合、これは十分な柔軟性がありません。

もちろん、独自のトークナイザーを作成することもできます。これは、自分で行ってしまえば、思ったほど難しくありません。代わりにツール/ライブラリを使用する必要があると言う人もいますが、私がそう言う人のほとんどは、学校でこのように学んだため、実際にトークナイザーやパーサー。JSON/JSOP TokenizerJCR XPath ParserJCR SQL-2 Parserなど、オープンソースの手書きのトークナイザーとパーサーが多数あります。

于 2012-05-12T08:16:07.590 に答える
0

TinyPGをダウンロードすることをお勧めします。Tiny Parser Generator であり、文法については EBNF (Extended Backus-Naur Form) に似た言語をサポートしています。これは C#/VB 用ですが、基本的な文法定義はパーサーについて多くのことを教えてくれるはずです。C# または VB を理解している場合は、生成されたパーサーを調べて、独自のパーサーを作成するためのアイデアを得ることができます。

于 2012-05-12T03:57:15.657 に答える