[英]Creating Lexical Analyzer for java
我正在嘗試創建一個詞法分析器
cond_exp→條件| 條件op cond_exp
條件→single_cond | (條件)| cond_exp
single_cond→變量| 變量” | 不變
op→和| 或| 暗示
常數→true | 錯誤 !true | !假
變量→p | q | r
對於lex操作中的switch case,我得到一個重復的case標簽,非常感謝您的幫助,這是我到目前為止所擁有的:
作為示例,這是一個示例字符串:(((p'和q)暗含(r或r')))
public class Q4Lexical {
//character classes
private static final String Letter="0";
private static final String opLetter="0";
private static final String unknown="99";
private static final String EOF="100";
//Token classes
public static final String INT_LIT="10";
public static final String IDENT="11";
public static final String pVarible="20";
public static final String qVarible="21";
public static final String rVarible="22";
public static final String andOperation="23";
public static final String orOperation="24";
public static final String impliesOperation="25";
public static final String tConstant="26";
public static final String fConstant="27";
public static final String tpConstant="28";
public static final String fpConstant="29";
public static final String LEFT_PAREN="30";
public static final String RIGHT_PAREN="31";
// Global Variables
public static int current=0;
static String StringClass;
static String lexeme="";
static String nextChar;
static int lexLen=0;
static int token;
static String nextToken;
static String expression="((p' and q) implies (r or r'))";
public static boolean isVarible (String c){
if((c.equalsIgnoreCase("p")) || (c.equalsIgnoreCase("q")) ||
(c.equalsIgnoreCase("r")) || (c.equalsIgnoreCase("p'")) ||
(c.equalsIgnoreCase("q'")) || (c.equalsIgnoreCase("r'")))
return true;
else return false;
}
public static boolean isOperation(String c){
if((c.equalsIgnoreCase("and")) || (c.equalsIgnoreCase("or")) ||
(c.equalsIgnoreCase("implies")))
return true;
else return false;
}
public static boolean isSpace(String c){
if(c.equalsIgnoreCase(" "))
return true;
else return false;
}
public static void getString(){
if(current< expression.length()){
nextChar= expression.substring(current);
current++;
if(isVarible(nextChar))
StringClass=Letter;
else if(isOperation(nextChar))
StringClass=opLetter;
else
StringClass=unknown;
}
else
StringClass = "#";
}
public static void getNonBlank(){
while(isSpace(nextChar))
getString();
}
public static String lookup(String c){
switch(c){
case "(":
addString();
nextToken= LEFT_PAREN;
break;
case ")":
addString();
nextToken= RIGHT_PAREN;
break;
case "and":
addString();
nextToken= andOperation;
break;
case "or":
addString();
nextToken=orOperation;
break;
case "implies":
addString();
nextToken=impliesOperation;
break;
default:
addString();
nextToken=unknown;
break;
}
return nextToken;
}
public static void addString(){
if (lexLen <= 98)
lexeme+=nextChar;
else
System.out.println("Error - Lexeme is too long");
}
public static String lex(){
lexeme="";
lexLen=0;
getNonBlank();
switch(StringClass){
case Letter:
addString();
getString();
while(StringClass.equals(Letter) || StringClass.equals(opLetter)){
addString();
getString();
}
switch (nextToken) {
case "q":
nextToken=qVarible;
break;
case "p":
nextToken=pVarible;
break;
case "r":
nextToken=rVarible;
break;
}
break;
case opLetter:
addString();
addString();
while (StringClass.equals(opLetter)){
addString();
getString();
}
nextToken=INT_LIT;
break;
case unknown:
lookup(nextChar);
getString();
break;
case EOF:
nextToken=EOF;
break;
}
System.out.println("Next Token is : "+nextToken+" Next Lexeme is : "+lexeme);
return nextToken;
}
public static void main(String[] args) {
getString();
do {
lex();
} while (current != expression.length());
}
}
Letter和opLetter都等於同一事物“ 0”,
// character classes
private static final String Letter = "0";
private static final String opLetter = "0";
並且您的編譯器在抱怨,因為不允許兩個大小寫常量相同。
switch (StringClass) {
case Letter:
// ....
// not allowed
case opLetter:
加上它只是沒有意義。 如果StringClass為“ 0”,應激活哪種情況?
解決方案:不要讓他們等於同一件事。 更好的是,考慮使用枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.