【问题标题】:Trying to understand parsing and scanning (difference for reg. languages and cf languages)试图理解解析和扫描(reg. 语言和 cf 语言的区别)
【发布时间】:2015-06-04 18:46:09
【问题描述】:

首先,我不学习计算机科学,我只是对这个学科感兴趣。

解析器基本上是正确的:

  1. 读取输入
  2. 创建令牌
  3. 实际解析令牌并创建 AST

所以我认为,为了确定一个单词是否属于常规语言,您需要使用 FSM,而对于 CF 语言,您需要一个解析器,因为可能存在递归结构。因此,存在用于常规语言的扫描器生成器和用于 CF 语言的解析器生成器。

但是现在我读到你可以为正则表达式构建一个像样的递归解析器:

http://matt.might.net/articles/parsing-regex-with-recursive-descent/

那么这一切是如何结合在一起的呢?

为什么我需要解析常规语言?我认为有限状态机就足够了吗?

如果,例如我想识别java程序中的块cmets(即/* .. */),我只需要写一个FSM,所以基本上是一个switch-case-statement。我不需要解析器...

感谢您的帮助和澄清!

【问题讨论】:

    标签: regex parsing regular-language context-free-language


    【解决方案1】:

    正则表达式可以匹配的内容与解析正则表达式所需的内容是有区别的。例如,正则表达式可以包含嵌套组,因此您无法使用正则表达式解析这些组。例如,您必须“计算”嵌套的括号对,这超出了常规语言的能力。

    另请参阅:Is there a regular language to represent regular expressions

    【讨论】:

    • aah...所以正则表达式本身不是正则语言,只有它们匹配的是什么?因此,为了检查某些内容是否在正则语言中,您使用 FSM,但必须解析正则表达式本身?但仍然:我只需要 CF 语言的解析器?对于 RL,一个 FSM 就足够了?
    • 这里的“解析器”是什么?例如,C 函数scanf() 用于将字符串表示解析为不同的基本数据类型,如数字或字符串。 JavaScript 有一个parseInt() 函数将字符串解析为数字。两者都只需要类似 FSM 的实现来解析输入。是的,对于解析 RL,FSM 就足够了。
    • 嗯好吧..我认为“解析器”意味着有一个语法树......在 parseInt 的情况下,例如,它被称为扫描仪......
    猜你喜欢
    • 2016-11-24
    • 2023-03-06
    • 2011-02-09
    • 1970-01-01
    • 2015-07-28
    • 2017-09-20
    • 1970-01-01
    • 2017-09-19
    • 2023-03-06
    相关资源
    最近更新 更多