我正在尝试使用针对以下语法的递归下降解析来检查语法的正确性:
<FACTOR> ::= <EXPR> | i
<TERM> ::= <FACTOR> * <TERM> | <FACTOR>
<EXPR> ::= <TERM> + <EXPR> | <TERM>
问题在于,似乎语法是递归的,因为factor
可以是expr
,term
可以是factor
。因此,似乎无法使用程序检查这是否正确。但是我不确定这是否正确,因为这是作为一项任务给出的。有人可以告诉我它是否正确,如果是真的,我可以使用一种可能的算法来检查它吗?
感谢。
不知道它是否有帮助,但这是我目前的代码:
//Variable to store our current character index
static int i = 0;
//Variable to store our input string
static String input;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Enter text to check for correctness: ");
input = scan.nextLine();
if(input.charAt(input.length() - 1) != '#'){
input += scan.nextLine();
}
//Remove all spaces just to prevent space interference
input = input.replaceAll(" ", "");
if(Factor(nextChar()))
{
System.out.println("Your text input is correct");
}
else
{
System.out.println("Your text input does not conform with the grammar");
}
}
public static boolean Factor(char ourChar){
//<factor> ::= <expr> | i
if(ourChar == '#')
{
//If it's # we should bounce back if and return true since no errors yet
return true;
}
if(ourChar == 'i')
{
//if it's i then return true
return true;
}
else{
//so the character is not i, let's check if satisfies the Expr grammar
if(!Expr(ourChar))
{
//oooh, it's not return false!
return false;
}
return true;
}
}
public static boolean Expr(char ourChar){
//<expr> ::= <term> + <expr> | <term>
//Before you can be an expression, you must start with a term
if(!Term(ourChar))
//so it doesn't start with term? Bounce back dear
return false;
if(nextChar() != '+'){
//The next character is not a plus, return false to sender
return false;
}
else
{
//So it's plus? Ok, let's check if the next character is another expr
if(!Expr(nextChar()))
return false;
else
//Everybody satisfied, return true
return true;
}
}
public static boolean Term(char ourChar){
//<term> ::= <factor> * <term> | <factor>
//If the character does not start with a factor bounce back
if(!Factor(ourChar))
return false;
if(nextChar() != '*'){
//Yekpa! The factor is not followed by * so bounce back
return false;
}
else{
//SO, it's a star. Ok, if it's followed by a term, bounce back
if(!Term(nextChar()))
{
return false;
}
//Well, all bouncers satisfied, so return true
return true;
}
}
public static char nextChar(){
i++;
return input.charAt(i - 1);
}
答案 0 :(得分:1)
问题中键入的语法与正常表达式语法不对应,因为它不允许使用括号。它也含糊不清。所以我会选择“不,以下语法不正确。”
我建议使用以下语法(注意括号):
<FACTOR> ::= ( <EXPR> ) | i
<TERM> ::= <FACTOR> * <TERM> | <FACTOR>
<EXPR> ::= <TERM> + <EXPR> | <TERM>
答案 1 :(得分:0)
语法含糊不清。例如,“i”可以通过推导出来
“&LT;” FACTOR “&gt;” 中=&GT;我
要么
“&LT;” FACTOR “&gt;” 中=&GT; “&LT;” EXPR “&gt;” 中=&GT; “&LT;” TERM “&gt;” 中=&GT; “&LT;” FACTOR “&gt;” 中=&GT;我
“&LT;” FACTOR&GT;相当于“&lt;”EXPR“&gt;”和“&lt;”TERM“&gt;”,
因为
“&LT;” FACTOR “&gt;” 中:: =“&lt;”EXPR“&gt;”和
“&LT;” TERM “&gt;” 中:: =“&lt;”FACTOR“&gt;”和
“&LT;” EXPR “&gt;” 中:: =“&lt;”TERM“&gt;”
所以,你可以把
“&LT;” EXPR “&gt;” 中:: = i +“&lt;”EXPR“&gt;” |我*“&lt;”EXPR“&gt;” |一世
这个CFG没有歧义,没有左递归,但它应该是正确分解的,所以你可以使用:
“&LT;” EXPR “&gt;” 中:: = i“&lt;”AUX“&gt;”
“&LT;” AUX “&gt;” 中:: = +“&lt;”EXPR“&gt;” | *“&lt;”EXPR“&gt;” | Ë
(e是空字符串)
您可以为此语法构建递归下降解析,因为此语法为LL(1)并生成相同的语言。
祝你好运。