gpt4 book ai didi

compiler-errors - 在Flex中检查错误的标识符模式

转载 作者:行者123 更新时间:2023-12-02 10:42:14 24 4
gpt4 key购买 nike

我只是想学习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();
}

最佳答案

这不是一个简单的问题,因为在词法分析器中检测到哪些错误是语言处理系统整个设计的大部分,并且是该语言的句法和词法结构的性质。经检查,某些元素可能看起来像词汇错误,但事实并非如此。它确实取决于语言的性质;例如,在Fortran中,空格没有意义,并且有一个著名的示例:

        DO 10 I = 1.10

这是关键字 DO,标签 10,标识符 I,运算符 =和数字 1.10吗?实际上,它是标识符 DO10I ...等;而
        DO 10 I = 1,10

是否有关键字 DO ...

因此,有时候,当看到序列 123abc时,您不能自动假定它只是一个无效的标识符。有时最好将它作为两个有效的 token NUMBERIDENTIFIER返回,并将其留给解析器报告所导致的任何错误。使用此方法时要注意的唯一困难区域是在浮点数常量中指定指数时以及使用整数范围时。指数用法的一个例子是:
-1234.457E+12

它在数字中嵌入了一个字母,需要将其作为某种 NUMBER token 返回。同样,符号运算符的重载也会导致词法分析错误检测出现问题。在前面的数字中,它有两个符号 -+。如果将它们识别为数字的一部分,什么时候将符号 -+识别为 SUBTRACTADD标记?以以下表达式为例:
i=i-1;

这是 IDENTIFIEREQUALSIDENTIFIERNUMBER吗?不,当然不。因此,这意味着我们不能总是假设 -1只是 NUMBER

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

因此,只有一个问题:“如何检查词法分析器中格式错误的标识符和数字?”负载很大,并显示它可能代表尚未完全吸收主题区域的人。此类问题通常会在类测试中发布,因为这是教师查看学生是否具有更深的语言处理知识的好方法,或者只是以表面的方式回答它,并尝试为此类对象编写模式。

如前所述,幼稚的答案只是编写正则表达式模式以匹配无效词素的示例。

例如,我可以添加模式:
[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);}

但是通常在大多数编译器中都不会这样做。大多数编译器检测到的唯一词法错误是未封闭的字符串和注释。这也是大多数语言不允许在字符串中使用换行符的原因,因为这样可以很容易地检测到未封闭的字符串。

关于compiler-errors - 在Flex中检查错误的标识符模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30001711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com