言語を一連のトークンに変換する字句解析器を作成する割り当てがあります。私は 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 行の文字列に読み込む方法が原因でしょうか?