言語 c-- の語彙アナライザーを実装する割り当てがあります。c_code を一連のトークンに変換する必要があります。これは、操作が容易になるため、内部で整数として表されます。言語の字句上の慣例として、double、else、if、int、return、void、while などのキーワードがあります。+ - * / < <= > >= == != = のような特殊記号も。、 。( ) [ ] { } /* */ //. 識別子は、任意の文字またはアンダースコアで始まり、その後に文字、数字、およびアンダースコアの任意の組み合わせが続きます。空白はトークンを区切り、無視されます。数値は整数または小数にすることができ、コメント行とブロックを使用できます。
import java.io.*;
public class Lex {
public static boolean contains(char[] a, char b){
for (int i = 0; i < a.length; i++) {
if(b == a[i])
return true;
}
return false;
}
public static void main(String args[]) throws FileNotFoundException, IOException{
//Declaring token values as constant integers.
final int T_DOUBLE = 0;
final int T_ELSE = 1;
final int T_IF = 2;
final int T_INT = 3;
final int T_RETURN = 4;
final int T_VOID = 5;
final int T_WHILE = 6;
final int T_PLUS = 7;
final int T_MINUS = 8;
final int T_MULTIPLICATION = 9;
final int T_DIVISION = 10;
final int T_LESS = 11;
final int T_LESSEQUAL = 12;
final int T_GREATER = 13;
final int T_GREATEREQUAL = 14;
final int T_EQUAL = 16;
final int T_NOTEQUAL = 17;
final int T_ASSIGNOP = 18;
final int T_SMEICOLON = 19;
final int T_PERIOD = 20;
final int T_LEFTPAREN = 21;
final int T_RIGHTPAREN = 22;
final int T_LEFTBRACKET = 23;
final int T_RIGHTBRACKET = 24;
final int T_LEFTBRACE = 25;
final int T_RIGHTBRACE = 26;
final int T_ID = 27;
final int T_NUM = 28;
char[] letters_ = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D',
'E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','_'};
char[] numbers = {'0','1','2','3','4','5','6','7','8','9'};
char[] symbols = {'+','-','*','/','<','>','!','=',':',',','.','(',')','[',']','{','}'};
FileInputStream fstream = new FileInputStream("src\\testCode.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
BufferedWriter bw1 = new BufferedWriter(new FileWriter(new File("src\\output.txt"), true));
BufferedWriter bw2 = new BufferedWriter(new FileWriter(new File("src\\output2.txt"), true));
String scanner;String temp = "";
int n = 0;
while((scanner = br.readLine()) != null){
for (int i = 0; i < scanner.length(); i++) {
for (int j = 0; j < scanner.length(); j++) {
if(contains(letters_,scanner.charAt(i)) || contains(numbers,scanner.charAt(i)) || contains(symbols,scanner.charAt(i))){
j++;
n++;
if(scanner.charAt(j) == ' ' || scanner.charAt(j) == '\n' || scanner.charAt(j) == '\t'){
}
}
}
}
}
in.close();
}
}
これは私たちのテストコードです:
int fact(int x) {
// recursive factorial function
if (x>1)
return x * fact(x-1);
else return 1;
}
void main(void) {
/* CS 311 project 2
A lexical analyzer */
int x, y, z;
double _funny;
x = get_integer();
_Funny = get_double();
if (x>0)
print_line(fact(x));
else if (_funny != 3.14)
print_line(x*_funny);
}
これが出力になるはずです
3 27 21 3 27 22 25 2 21 27 13 28 22 4 27 9 27 21 27 8 28 22 18 1 4 28 18 26 5 27 21 5 22 25 3 27 19 27 19 27 18 0 27 18 27 817 27 17 27 21 22 18 2 21 27 13 28 22 27 21 27 21 27 22 22 18 1 2 21 27 12 28 22 27 21 27 9 27 22 18 26
INT id leftparen INT id rightparen leftbrace IF leftparen id より大きい num rightparen RETURN id 乗算 id leftparen id マイナス num rightparen セミコロン ELSE RETURN num セミコロン rightbrace VOID id leftparen VOID rightparen leftbrace INT id コンマ id コンマ id セミコロン DOUBLE id セミコロン id assignop id leftparen rightparen セミコロンid assignop id leftparen rightparen セミコロン IF leftparen id greater num rightparen id leftparen id leftparen id rightparen rightparen セミコロン ELSE IF leftparen id notequal num rightparen id leftparen id 乗算 id rightparen セミコロン rightbrace
ユーザー John の提案に基づいてコードを書きました。これがどのように機能するかについてはまだ混乱しています。2番目のループを繰り返して空白またはシンボルを見つけると、シンボルのwsの前にどのタイプのトークンが来たかがわかります。スキップした文字を文字列に入れ、case ステートメントを使用してそれを判断しようとしましたが、ファイル全体が文字列に書き込まれるため、トークンが一致しないと思います。また、メソッドがコメントを見つけて安全に無視するにはどうすればよいでしょうか?