Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 在flex中检查错误的标识符模式_Compiler Errors_Flex Lexer_Lex_Lexical Analysis - Fatal编程技术网

Compiler errors 在flex中检查错误的标识符模式

Compiler errors 在flex中检查错误的标识符模式,compiler-errors,flex-lexer,lex,lexical-analysis,Compiler Errors,Flex Lexer,Lex,Lexical Analysis,我只是想学习flex,下面是flex中检测标识符和数字的示例代码。我想通过识别错误的标识符和数字模式(例如:1var、12.2.2、5等)来改进代码。我将如何检测它?我必须在代码中做哪些更改 我的示例代码如下所示: ID [a-zA-z][a-zA-z0-9]* DIGIT [0-9] %% [\t]+ {ID} {printf("\n identifier found");} {DIGIT} {printf("\nDigit found");} .

我只是想学习flex,下面是flex中检测标识符和数字的示例代码。我想通过识别错误的标识符和数字模式(例如:1var、12.2.2、5等)来改进代码。我将如何检测它?我必须在代码中做哪些更改

我的示例代码如下所示:

ID       [a-zA-z][a-zA-z0-9]*
DIGIT    [0-9]

%%
[\t]+
{ID}     {printf("\n identifier found");}
{DIGIT}  {printf("\nDigit found");}
.        {}
%%

int main(int argc, char *argv[]){         
    yylex();         
}

这不是一个简单的问题,因为在lexer中检测到什么错误在很大程度上是语言处理系统的整个设计以及语言的语法和词汇结构的性质的一部分。有些元素在检查时可能看起来像是词汇错误,但结果可能不是。这实际上取决于语言的性质;例如,在Fortran中,空格没有任何意义,有一个著名的例子:

        DO 10 I = 1.10
这是关键词
DO
、标签
10
、标识符
I
、操作员
=
和编号
1.10
?实际上,它是标识符
DO10I
。。。等鉴于

        DO 10 I = 1,10
是否有关键字
DO

因此,有时,当看到序列时,
123abc
,您不能自动假定它只是一个无效标识符。有时,最好将其作为两个有效标记
NUMBER
IDENTIFIER
返回,并将其留给解析器报告由此产生的任何错误。使用这种方法唯一需要注意的困难是在浮点数常量中指定指数时,以及在使用整数范围时。指数使用的一个例子是:

-1234.457E+12
这个数字中嵌入了一个字母,需要作为某种
number
标记返回。类似地,符号运算符上的重载也会导致词法分析错误检测问题。在前面的数字中,它有两个符号
-
+
。如果它们被识别为数字的一部分,那么符号
-
+
何时会被识别为
减法
添加
标记?以这个表达式为例:

i=i-1;
这是
标识符
等于
标识符
编号
?不,当然不是。这意味着我们不能总是假设
-1
只是一个
数字

前面提到的整数范围在许多语言(特别是Pascal)中表示为
1..8
,使用两个点表示上限和下限,在处理像
1.2
这样的浮点表达式时会造成困难

因此,只有一个问题,“我如何检查lexer中格式错误的标识符和数字?”非常复杂,这表明它可能代表没有完全理解主题领域的人。像这样的问题通常会在课堂测试中公布,因为它们是教师了解学生是否拥有更深入的语言处理知识的好方法,或者只是以表面的方式回答,并尝试为这些对象编写模式

如前所述,简单的答案是只编写正则表达式模式来匹配无效词素的示例

例如,我可以添加以下模式:

[0-9]+\.[0-9]+(\.[0-9]+)+    {printf("Bad float: %s\n", yytext);}
[0-9]+[a-zA-Z][a-zA-Z0-9]+   {printf("Bad Identifier: %s\n", yytext);}
但在大多数编译器中通常不会这样做。大多数编译器检测到的唯一词汇错误是未关闭的字符串和注释。这也是大多数语言不允许在字符串中使用换行符的原因,因为这样很容易检测到未关闭的字符串