问题标签 [lex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
4956 浏览

parsing - 解析,在哪里可以了解

我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息?

0 投票
8 回答
38153 浏览

python - 用于在 python 中进行词法分析、标记化和解析的资源

人们可以向我指出有关使用 Python 进行词法分析、解析和标记化的资源吗?

我正在对一个开源项目 ( hotwire ) 进行一些修改,并希望对输入其中的命令进行lexesparse 和 tokenise的代码进行一些更改。由于它是真正的工作代码,它相当复杂并且有点难以解决。

我以前没有处理过 lex/parse/tokenise 的代码,所以我想一种方法是在这方面完成一两个教程。我希望能学到足够的知识来浏览我真正想要更改的代码。有什么适合的吗?(理想情况下可以在一个下午完成,而不必先购买和阅读龙书……)

编辑:(2008 年 10 月 7 日)以下答案都没有完全给出我想要的。有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写自己的基本解析器,而不是使用 lex 和 yacc 或类似工具。完成后,我可以更好地理解现有代码。

那么有人能指点我一个教程,我可以从头开始构建一个基本的解析器,只使用 python 吗?

0 投票
8 回答
1475 浏览

python - 在 Perl 或 Python 中模拟类似 lex 的功能

这是交易。有没有办法根据多个正则表达式在一行中对字符串进行标记?

一个例子:

我必须根据不同的正则表达式获取所有 href 标记、它们对应的文本和其他一些文本。所以我有 3 个表达式,并且想对行进行标记并提取与每个表达式匹配的文本标记。

我实际上是使用 flex 完成的(不要与 Adob​​e 混淆),它是旧 lex 的一个实现。lex 通过基于表达式执行“动作”提供了一种优雅的方式来做到这一点。也可以控制 lex 读取文件的方式(基于块/行的读取)。

问题是 flex 实际上生成了实际执行标记化工作的 C/C++ 代码。我有一个包含所有这些东西的 make 文件。我想知道 perl /python 是否可以以某种方式做同样的事情。只是我想用一种编程语言本身做我喜欢的一切。

标记化只是我想要在我的应用程序中做的事情之一。

除了 perl 或 python 之外,任何语言(也可以是函数式)都可以做到这一点吗?

我确实在这里阅读了 PLY 和 ANTLR(解析,我在哪里可以了解它)。

但是有没有办法在 python 本身中自然地做到这一点?请原谅我的无知,但这些工具是否用于任何流行的产品/服务?

谢谢你。

0 投票
7 回答
4129 浏览

parsing - 动态 (?) 解析器

是否存在在运行时生成 AST/解析树的解析器?有点像一个库,可以接受一串 EBNF 语法或类似的东西并吐出一个数据结构?

  • 我知道 antlr、jlex 和他们的同类。他们生成可以做到这一点的源代码。(喜欢跳过编译步骤)
  • 我知道 Boost::Spirit,它使用一些带有 C++ 语法的黑魔法在执行时生成这样的东西(肯定更接近我想要的,但在 C++ 方面我是个无赖。而且它仍然有点限制,因为你的语法是硬编码的)
  • 我不知道 python 或 ruby​​ 中的任何内容,尽管编译器编译器在这种语言中可能非常有效......

现在我知道解析器组合器了。(谢谢,乔纳斯)还有一些图书馆(谢谢 eliben)

顺便说一句,我最近还注意到Parsing Expression Grammars,如果有人实现它听起来很酷(他们说 Perl 6 会有它,但 Perl 回避了我的理解)

0 投票
2 回答
2454 浏览

parsing - 在 flex/lex (parser-generator) 中实现单词边界状态

我希望能够判断模式匹配是出现在单词字符之后还是非单词字符之后。换句话说,我想在 flex/lex 不支持的模式的开头模拟 \b 分词正则表达式字符。

这是我在下面的尝试(不能按预期工作):

输入 :

预期产出

实际输出:

我这样做是因为我想做方言器之类的事情,而且我一直想学习如何使用真正的词法分析器。有时我要替换的模式需要是单词的片段,有时它们只需要是整个单词。

0 投票
14 回答
67582 浏览

c++ - 用于创建 C/C++ 解析器/分析器的好工具

有哪些好的工具可以快速开始解析和分析 C/C++ 代码?

特别是,我正在寻找处理 C/C++ 预处理器和语言的开源工具。这些工具最好使用 lex/yacc(或 flex/bison)作为语法,不要太复杂。他们应该处理最新的 ANSI C/C++ 定义。

这是我到目前为止发现的,但还没有详细研究它们(想法?):

  • CScope - 老式 C 分析器。不过,似乎没有进行完整的解析。被描述为用于查找 C 函数的美化“grep”。
  • GCC - 每个人都喜欢的开源编译器。非常复杂,但似乎可以做到这一切。有一个用于创建 GCC 扩展的相关项目称为GEM,但自 GCC 4.1 (2006) 以来尚未更新。
  • PUMA - 纯机械手。(来自页面:“该项目的目的是提供一个类库,用于分析和操作 C/C++ 源。为此,PUMA 提供了用于扫描、解析和操作 C/C++ 源的类。”) . 这看起来很有希望,但自 2001 年以来一直没有更新。显然 PUMA 已被合并到AspectC++中,但即使是这个项目自 2006 年以来也没有更新过。
  • 各种 C/C++ 原始语法。你可以得到c-c++-grammars-1.2.tar.gz,但它自 1997 年以来一直无人维护。谷歌搜索一下就可以找到其他可以作为起点的基本 lex/yacc 语法。
  • 还有其他人吗?

我希望以此为起点,将 C/C++ 源代码翻译成新的玩具语言。

谢谢!-马特

(添加 2/9):只是澄清一下:除了 C/C++ 代码本身之外,我还想从预处理器中提取语义信息。我不希望“#define foo 42”消失在整数“42”中,但仍与名称“foo”相关联。不幸的是,这排除了几个首先运行预处理器并且只提供 C/C++ 解析树的解决方案)

0 投票
5 回答
52382 浏览

parsing - Flex/Lex 和 Yacc/Bison 有什么区别?

Flex & Lex 和 Yacc & Bison 有什么区别。我在互联网上疯狂搜索,但没有找到任何可靠的答案。

我可以在 Ubuntu 上安装纯 Lex 和 Yacc,还是只能安装 flex 和 bison。我很困惑。

  • Lex 或 Yacc 是否仍由某人维护?
  • 他们都是免费的吗?
  • 如果 Lex 不是免费的,为什么我要在我的 Ubuntu 发行版上安装它?

    /li>
0 投票
2 回答
637 浏览

dictionary - 在 lex/yacc 中使用字典数据结构

我正在为使用 lex/yacc 创建的微处理器编写汇编程序。

我想在我的汇编代码中实现标签,我认为这样做的一个好方法是有一个 {name:line#} 形式的标签字典。然后我可以在插入标签时检查,如果它已经定义,它是一个错误。

那么如何在 lex/yacc 中使用字典结构呢?

0 投票
1 回答
333 浏览

lex - 命令在 lex 中失败

我在我的程序中使用 lex,我遇到了一个需要帮助的问题。

我的程序以 [something " something] 的形式接受其输入。这工作正常。

但是,我还需要接受 [something"something] 形式。

有没有一种方法可以让我在 lex 中有某种第一种情况,所有输入都通过(如预处理),然后在我的程序的其余部分继续进行相同的修改输入?

这就是我所说的:

0 投票
2 回答
1700 浏览

c - 使用 unput 错误

我创建了 test.l,输入到 flex,它以 main 函数结束。

当 main 函数实现为:

我没有问题。

我想诱使解析器相信第一个字符始终是分号,所以我将 main 实现为

以上导致段故障。

为什么使用 unput 会导致段错误?