📜  词汇错误

📅  最后修改于: 2022-05-13 01:57:02.653000             🧑  作者: Mango

词汇错误

当标记模式与剩余输入的前缀不匹配时,词法分析器会卡住,必须从该状态恢复以分析剩余输入。简而言之,当一个字符序列与任何标记的模式不匹配时,就会发生词法错误。它通常发生在程序执行期间。

词法错误的类型:

词法分析器中可能发生的词法错误类型如下:

1.超过标识符或数字常量的长度。

例子:

C++
#include 
using namespace std;
  
int main() {
  
    int a=2147483647 +1;
    return 0;
}


C++
#include 
using namespace std;
  
int main() {
  
    printf("Geeksforgeeks");$
    return 0;
}


C++
#include 
using namespace std;
  
int main() {
/* comment 
    cout<<"GFG!";
    return 0;
}


C++
#include 
using namespace std;
  
int main() { 
  
    int 3num= 1234;    /* spelling error as identifier 
                       cannot start with a number*/
    return 0;
}


C++
#include 
using namespace std;
  
int main() {
  
    int x = 12$34; /*lexical error as '$' doesn't 
                     belong within 0-9 range*/
    return 0;
}


C++
#include  /*missing 'o' character
                     hence lexical error*/
using namespace std;
  
int main() {
  
    cout<<"GFG!";
    return 0;
}


C++
#include 
using namespace std;
  
int mian()
{ 
  /* spelling of main here would be treated as an lexical
     error and won't be considered as an identifier,
     transposition of character 'i' and 'a'*/
    cout << "GFG!";
    return 0;
}


这是一个词法错误,因为有符号整数介于 -2,147,483,648 和 2,147,483,647 之间

2.非法字符的出现

例子:

C++

#include 
using namespace std;
  
int main() {
  
    printf("Geeksforgeeks");$
    return 0;
}

这是一个词法错误,因为非法字符$ 出现在语句的末尾。

3.不匹配的字符串

例子:

C++

#include 
using namespace std;
  
int main() {
/* comment 
    cout<<"GFG!";
    return 0;
}

这是一个词法错误,因为注释“*/”的结尾不存在,但开头存在。

4.拼写错误

C++

#include 
using namespace std;
  
int main() { 
  
    int 3num= 1234;    /* spelling error as identifier 
                       cannot start with a number*/
    return 0;
}

5.用不正确的字符。

C++

#include 
using namespace std;
  
int main() {
  
    int x = 12$34; /*lexical error as '$' doesn't 
                     belong within 0-9 range*/
    return 0;
}

其他词汇错误包括

6.删除应该出现的字符。

C++

#include  /*missing 'o' character
                     hence lexical error*/
using namespace std;
  
int main() {
  
    cout<<"GFG!";
    return 0;
}

7.两个字符的换位。

C++

#include 
using namespace std;
  
int mian()
{ 
  /* spelling of main here would be treated as an lexical
     error and won't be considered as an identifier,
     transposition of character 'i' and 'a'*/
    cout << "GFG!";
    return 0;
}

错误恢复技术

当出现词法分析器无法继续进行的情况时,因为没有任何标记模式与剩余输入的任何前缀匹配。最简单的恢复策略是“恐慌模式”恢复。我们从剩余的输入中删除连续的字符,直到词法分析器可以在剩下的输入的开头识别出格式良好的标记。

错误恢复操作是:

  1. 两个相邻字符的转置。
  2. 在剩余的输入中插入一个缺失的字符。
  3. 用另一个字符。
  4. 从剩余的输入中删除一个字符。