为java创建词法分析器的编程语言
我正在尝试为你创建一个词法分析器
cond_exp→ 条件|条件操作条件_exp
条件→ 单程| |(条件)|单程|
一秒钟→ 变量|变量|常数
op→ 和|或|暗示
不变的→ 对|错|!没错!假的
变数→ p | q | r
对于lex operation中的开关箱,我得到了一个重复的箱子标签,我将感谢您的帮助,这是我目前所拥有的:
例如,这是一个示例字符串:((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());
}
}
共 (0) 个答案