代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

词汇分析问题

  •  3
  • Navaneeth K N  · 技术社区  · 14 年前

    我在看龙书。引用书中的文本(3.1.4词汇错误,Pno 114)

    词法分析器很难理解 告诉别人,没有别人的帮助 组件,有一个 源代码错误。例如,如果 绳子 fi 遇到的错误 上下文:

    fi ( a == f(x) ) ...
    

    词法分析器无法判断 是关键字拼写错误 if 或者一个未声明的函数 标识符。自 是有效的 lexeme表示标记id,词法 id 到 解析器并让 编译器-可能是 此案例-处理由于

    看完这篇文章我有点困惑。我的理解是词法分析器开始从左到右处理文本,并在模式匹配时返回标记。所以对于一种语言来说 如果 是关键词匹配,怎么能 金融机构

    有什么想法吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   Johannes Schaub - litb    14 年前

    它与 if 令牌,但是 id 令牌,代表“标识符”。如果没有匹配的关键字,它就是万能的。词法分析器不知道在某些位置“期望”什么。它只返回令牌,解析器就会知道它期望什么。例如,C解析器必须接受以下语句,这是一个函数调用

    fi ( a  == f(x) );
    
        2
  •  2
  •   Il-Bhima    14 年前

    你必须区分语法分析和词汇分析。

    • 词法分析的任务是将一个字符序列转换成一个标记字符串。可以有各种类型的标记,例如标识符、加法运算符、语句结尾运算符等。只有遇到与任何标记都不对应的文本字符串时,词法分析才会失败并出现错误。对你来说 fi ( a == f(x) ) ... 将转换为 <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

    • 一旦生成了一个令牌字符串,就会执行语法分析。这通常涉及从标记构造某种语法树。解析器知道语言中允许的所有形式的有效语句。如果解析器找不到允许上述令牌序列的语法规则,它将失败。

        3
  •  1
  •   Alok Singhal    14 年前

    if 是给定点上唯一的预期输入吗?

    int a = 42;
    if (a == 42)
        puts("ok");
    

    与。

    int a = 42;
    fi (a == 42)
        puts("ok");
    

    fi 可能是函数调用。例如,上述 能够 拼写错误:

    int a = 42;
    fi(a == 42);
    puts("ok");
    

    哪里 金融机构 int 又回来了 void

        4
  •  1
  •   PeterK    14 年前

    对于词法分析错误的解释来说,这是一个糟糕的例子。本文试图告诉您的是,编译器无法识别您拼错了“if”关键字(将其反写)。它只看到“fi”,例如,它是一个有效的变量名,因此将id(例如“variable”)返回给解析器。解析器随后意识到语法错误。

    它与从左到右或从右到左无关。当然,编译器从左到右读取源代码。就像我说的-这个解释的关键词选择不当。