问题标签 [lexer]

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 投票
4 回答
3607 浏览

html - 如何在 C 中有效地构建解释器(lexer+parser)?

我正在尝试制作一种用于编写可以直接嵌入到 C/C++ 代码中的标记代码(例如 xml 和 html)的元语言。这是一个用这种语言编写的简单示例,我称之为 WDI(Web 开发接口):

基本上它是一个修改过的 C 源代码,具有用户友好的 html 界面。如您所见,传统的基于标签的样式被类似 C 的命令所取代,块由花括号分隔。我需要构建一个解释器来将此代码翻译为 html 并将其插入到 C 中,以便可以对其进行编译。C部分保持完整。在 wdi 源内部,不需要使用打印,每个 return 语句都将用于输出(在 printf 函数中)。该程序的输出将是干净的 html 代码。

因此,例如标题 1 标记将被转换为:

我的主要目标是创建一个解释器来将 wdi 源转换为 html,如下所示:

tag(attributes) {content}=><tag attributes>content</tag>

其次,解释器返回的 html 代码必须用 printfs 插入到 C 代码中。wdi 中出现的变量和函数也应该进行排序,以便将它们用作 printf 参数(示例源中的 toCapital(name) 的情况)。

我正在寻找有效的(我想创建一个快速的解析器)方法来为 wdi 创建一个词法分析器和解析器。已经尝试过 flex 和 bison,但我不确定它们是否是最好的工具。有什么好的选择吗?创建这样的解释器的最佳方法是什么?你能推荐一些关于这个问题的简短文献吗?

0 投票
1 回答
1542 浏览

string - Antlr Lexer 引用字符串谓词

我正在尝试构建一个词法分析器来标记单独的单词和引用的字符串。我得到以下信息:

对于极端情况,它需要解析:

作为三个标记:"string"作为 STRINGword1"word2作为 WORD。基本上,如果有最后一个引号,它必须是 WORD 的一部分。如果引号被空格包围,它应该是一个 WORD。

我为 WORD 尝试了这条规则,但没有成功:

0 投票
2 回答
6519 浏览

c# - 在 C# 中对部分 SQL 进行词法分析

我需要解析部分 SQL 查询(用于 SQL 注入审计工具)。例如

应该分解成像

他们是否至少是我的基础的 SQL 词法分析器或任何好的工具,如用于 C# 的野牛(尽管我宁愿不编写自己的语法,因为我需要支持 MySQL 5 的大部分语法,如果不是全部的话)

0 投票
1 回答
101 浏览

code-generation - JavaME 的解析器生成器

首先:我看过这个SO question 但不幸的是没有提到 JavaME

我正在寻找一个解析器/词法分析器生成器,它可以生成可以在 Blackberry 及其(令人讨厌的)JavaME 上运行的代码。

例如,起初我以为我可以使用 ANTLR,但运行时库似乎与 JavaME 不兼容

TIA

0 投票
3 回答
16810 浏览

c# - C# 有(直接)flex/yacc 端口吗?或者人们在 C# 中使用什么词法分析器/解析器?

我可能错了,但到目前为止,C#/.NET 似乎没有直接的 flex/bison (lex/yacc) 端口。

对于 LALR 解析器,我找到了 GPPG/GPLEX,对于 LL 解析器,有著名的 ANTLR。但是,我想尽可能地重用我的 flex/bison 语法。

  • C# 有没有直接的 flex/bison 端口?
  • 人们通常在 C# 中使用什么词法分析器/解析器?这样的选择有什么理由吗?
0 投票
3 回答
3240 浏览

scala - 词法分析器/解析器从 BNF 语法生成 Scala 代码

我目前正在寻找从 BNF 语法(ocamlyacc具有优先级和关联性的文件)生成 Scala 代码的词法分析器/解析器。我很困惑,因为我几乎没有发现如何去做。

对于解析,我发现scala-bison(我有很多麻烦)。所有其他工具都只是导入到 Scala 中的 Java 解析器(如ANTLR)。

对于词法分析,我一无所获。

我还找到了著名的 Scala解析器组合器,但是(如果我错了,请纠正我),即使它们非常吸引人,它们也会消耗大量时间和内存,主要是由于回溯

所以我有两个主要问题:

  • 为什么人们似乎只专注于 _parser 组合器?
  • 与 Scala 一起使用的最佳词法分析器/解析器生成器建议是什么?
0 投票
2 回答
8643 浏览

xml-parsing - bison/flex 中的简单 XML 解析器

我想使用 bison/flex创建简单的 xml 解析器。我不需要验证、注释、参数,只有<tag>value</tag>,其中可以是数字、字符串或其他<tag>value</tag>

例如:

如果有帮助,我知道可能出现的所有标签的名称。我知道给定标签可以容纳多少子标签。是否可以创建可以执行以下操作的野牛解析器:

标签和子标签数量:

  • 数量:1(唯一值)
  • str:1(唯一值)
  • 添加 | 子 | 穆尔| div: 2 (num | str | tag, num | str | tag)

你能帮我用语法来创建上面给出的 AST 吗?

0 投票
1 回答
830 浏览

lexer - 为什么 ANTLR 中的 'a'..'z' 匹配 $ 或 £ 等通配符

当我运行以下语法时:

我给输入“?test”为什么antlr接受这个作为有效输入?我认为 ('a'..'z') 只会匹配小写字母中的字符?

0 投票
2 回答
2519 浏览

string - 解析器和词法分析器的设计指南?

我正在为稍微复杂的数据格式编写词法分析器(使用 re2c)和解析器(使用 Lemon):类似于 CSV,但在特定位置具有特定的字符串类型(仅限字母数字字符、字母数字字符和减号,除此之外的任何字符引号和逗号,但带有平衡的大括号等),大括号内的字符串和看起来像函数调用的字符串,带有可以包含参数的左大括号和右大括号。

我第一次尝试它是一个有许多状态的词法分析器,每个状态都迎合特定的字符串格式。但是在来自词法分析器的许多无用的“意外输入”消息(变得非常大)之后,我意识到它可能正在尝试完成解析器的工作。我放弃了我的第一次尝试,使用了一个只有一个状态、许多字符标记和一个将标记组合成不同字符串类型的解析器的词法分析器。这效果更好,当某些东西关闭时,我会从解析器中得到更多有用的语法错误,但仍然感觉不太正确。我正在考虑向词法分析器添加一个或两个状态,但从解析器启动状态,它对给定实例中需要哪种字符串类型有更好的“概述”。总的来说我觉得有点傻:(

我没有正式的 CS 背景,并且对数学很重的理论有点回避。但也许某处有一个教程或书籍来解释词法分析器应该(和不应该)做什么以及解析器应该做什么工作。如何构建良好的标记模式,何时使用词法分析器状态,何时以及如何使用递归规则(使用 LALR 解析器),如何避免模棱两可的规则。一本讲授基础知识的实用食谱。“Lex and YACC Primer/HOWTO”很好,但还不够。因为我只是想解析一种数据格式,所以关于编译器构建的书(比如红龙书)对我来说看起来有点过大。

或者也许有人可以在这里给我一些简单的规则。

0 投票
3 回答
3670 浏览

lexer - 向 scintilla/scite 添加一个新的词法分析器(...最终是 wxPython StyledTextCtrl)

有没有人成功地将词法分析器添加到闪烁?

我一直在遵循 http://www.scintilla.org/SciTELExer.html 上的简短说明 - 甚至在http://www.scintilla.org/ScintillaDoc.html#BuildingScintilla发现了秘密的额外说明更改 Lexers 集)

一切都可以编译,我可以很好地将词法分析器添加到 SciTE,但是我的 ColouriseMapfileDoc 方法没有被调用(printf 不会产生输出)。如果我将相同的代码添加到例如 ColouriseLuaDoc 词法分析器中,一切都很好(printf确实会产生输出)。

具体来说我有

  1. scintilla/include/Scintilla.iface,添加val SCLEX_MAPFILE=99
  2. 以及任何词汇类 ID
  3. 在 scintilla/include 目录中运行HFacer.py并确认SciLexer.h文件已更改。
  4. LexMapfile.cxxColouriseMapfileDoc函数创建
  5. 在文件的末尾,将词法分析器 ID 和名称与函数相关联:

    LexerModule lmMapfile(SCLEX_MAPFILE, ColouriseMapfileDoc, "mapfile");

  6. 运行LexGen.py以生成所有 makefile(根据秘密说明)

  7. 通过克隆创建了一个新的 SciTE 属性文件scite/src/others.properties
  8. 设置一些样式
  9. scite/src/SciTEGlobal.properties添加到$(filter.conf)的定义中open.filter
  10. 将此语言添加到 SciTE 的语言菜单中,
  11. 构建了 Scintilla 和 SciTE。
  12. 抱怨和诅咒。

除了第 12 步之外,我做错了什么?