问题标签 [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.
scheme - 展示如何使用 Racket 词法分析器生成器的示例?
我最近在玩 Racket,目前正在为脚本语言的一个子集实现词法分析器......并且想知道是否有更多示例来展示如何在 Racket 中使用词法分析器生成器?
我了解文档中的计算器示例,但是显示全部功能太简单了……我特别好奇如何参考每个字符的位置……
php - 基于 XML 的模板引擎与 Smarty 词法分析器
Smarty 3 和它的新词法分析器以及它会给你作为模板设计师的更多功能带来了很多令人兴奋的事情,但是当它真正上架时,它的速度有多慢真是令人失望。在 Smarty 3 中从头开始编译模板需要一秒钟多的时间,而在 Smarty 2 中编译相同的模板大约需要半秒钟。不好。
但这确实让我想到,当 PHP 已经有 DOMDocument、SimpleXML 等可用的模块时,为什么还需要在 PHP 中实现一个成熟的语言解析器?
是否有任何基于 XML 扩展和/或 DOMDocument 的 PHP 模板引擎?如果有,表现如何?如果没有,那么有没有人试图写一个?
我可以预见的一个缺点是它只对基于 XML 的格式(如 XHTML 和 RSS)真正有用。对于生成其他输出(非 XML HTML、纯文本、CSS 等),它可能会产生很大的问题,但我相信您可以使用 CDATA 块解决它。使用 XML/DOM 进行模板解析还有其他我没有考虑过的含义吗?
c# - 谁能推荐一种使用 C# 执行以下字符串操作的方法
假设我有一个字符串:
“我的事件发生在 1976 年的纽约百老汇”
我有很多这样的字符串,但地点和日期各不相同。例如:
“我的事件发生在 1998 年的波士顿第二街” “我的事件发生在 1968 年的沃什特瑙的安娜堡”
所以一般形式是:“我的事件发生在 X 上的 Y 上的 Z”
我想解析字符串以提取 X、Y 和 Z
我可以使用 Split 并使用标记词“in”、“on”来分隔我想要的标记,但这似乎很笨拙。但是使用像 grammatica 这样的完整解析器/词法分析器似乎是重量级的。
我们将不胜感激地接受建议。
是否有用于 C# 的“简单”解析器词法分析器?
parsing - 解决语法中的歧义
我正在为 delphi 的 dfm 文件编写解析器。词法分析器如下所示:
野牛语法看起来像
解析二进制数据时会出现此语法的问题。dfm 文件中的二进制数据只不过是一个十六进制字符序列,每行的字符数从不超过 80 个。它的一个例子是:
如您所见,此元素缺少任何标记,因此字符串与其他元素发生冲突。在上面的示例中,第一行是返回正确的 token tkHexValue
。然而,第二个返回一个tkInteger
令牌,第三个返回一个tkIdentifier
令牌。因此,当解析到来时,它会因语法错误而失败,因为二进制数据仅由tkHexValue
标记组成。
我的第一个解决方法是要求整数具有最大长度(这有助于除二进制数据的最后一行之外的所有内容)。第二个是将tkHexValue
令牌移动到上方,tkIdentifier
但这意味着现在我不会有像这样的标识符F0
我想知道是否有任何方法可以修复这个语法?
parsing - 将词法分析器与许多解析器相结合
我知道词法分析器和解析器的典型配置,其中词法分析器读取源代码并生成标记,然后将其定向到解析器,解析器将它们用作其语法产生中的终端符号。在典型的递归下降解析器中,您首先调用一些表示起始非终结符的顶级函数,该函数调用其他函数并从词法分析器中逐个标记读取。
但是如果我在同一个词法分析器上需要两个不同的解析器怎么办?
我的意思是,他们都从同一个地方读取,因为我不想多次读取同一个源,即不允许多次传递,以避免在词法分析器中进行不必要的重复工作。我只希望当序列中的下一个标记刚刚生成时,两个解析器同时使用它。
但是我只能在这些解析器之一中调用一个顶级函数;不能同时调用两者:/
有没有办法以某种步进模式运行这些解析器?也就是说,当我有一个新的标记时,我想将它一个接一个地传递给两个解析器,但只是将它们推进那个标记,尽可能地更新它们的内部状态和数据结构,然后立即返回等待另一个令牌。
我以前从未见过任何这种配置。是否有可能以这种方式构建解析器?是否有一些关于如何在代码中构造这种解析器的材料?它有名字吗?
编辑 1: 我不想使用任何解析器生成器工具,而是自己编写代码,因为我想了解这种东西在内部是如何工作的。
java - 向 Java 解析器/词法分析器提供指令
有没有办法从java代码级别直接向解析器和词法分析器发出指令?如果不是,那么一个人怎么可能做到这一点呢?
问题是我想让解析器评估一个变量,备份,然后将该变量的值分配为对象名称。像这样:
解析器读取--> 好的,s 评估为“文本”...解析器回溯,同时将“文本”保存在内存中并将“文本”分配为 SomeClass 的新实例的名称,因此现在可以这样做:
我需要这样做,因为我必须实例化任意数量的 SomeClass 对象。每个人都必须有一个唯一的名称,最好是这样做:
我希望这是有道理的...
parsing - 我应该在哪里划清词法分析器和解析器之间的界限?
我正在为 IMAP 协议编写一个词法分析器,用于教育目的,但我不知道应该在哪里划定词法分析器和解析器之间的界限。以 IMAP 服务器响应为例:
此响应在正式语法中定义,如下所示:
由于它们被指定为字符串文字(也称为“终端”标记),因此词法分析器为每个标记发出一个唯一标记会更正确,例如:
或者发出这样的东西是否同样正确:
我的困惑是,前一种方法可能会使词法分析器过于复杂——如果\Answered
在两种不同的上下文中有两种含义,词法分析器就不会发出正确的标记。作为一个人为的例子(这种情况不会发生,因为电子邮件地址用引号括起来),词法分析器将如何处理像 \Answered@googlemail.com 这样的电子邮件地址?或者,形式语法是否旨在永远不允许出现这种歧义?
c++ - 用 Perl 编写编译器的一部分(用 C++ 编写)
我正在尝试更多地了解编译器和编程语言,不幸的是我的大学没有提供关于编译器的课程,所以我必须自己做(谢谢互联网)。
目前我试图理解并为我的语言实现词法分析器,我需要正则表达式。
我习惯于很快地编写 perl 正则表达式脚本,我认为我可以将 Perl 嵌入到我的 C++ 词法分析器中。现在的问题是:
- 它会导致Heavy开销吗?
- 我应该尝试与 BOOST(或任何其他 c++ 库好的 gor regex)和平相处吗?
谢谢您阅读此篇 :)
java - 使用 javax.lang.model 或 ANTLR JavaParser 获取 Java 源代码信息的示例/教程
我想为简单的 Java 逻辑创建一个类似流程图的自动可视化,为此我需要解析 Java 源代码,我有 2 个候选者, Java 6 的ANTLR和javax.lang.model。两者都不容易。
我还没有找到一个与我想要实现的目标非常接近的工作示例。
我想找到简单的变量声明、赋值和流程(if、for、switch、布尔条件等)
是否有针对其中任何一个的简单示例或教程?我发现很少有 ANTLR 示例(没有一个是开箱即用的,没有重要的“家庭作业”),对于 javax.lang.model 绝对没有
compiler-construction - 编写一个简单的编译器
我正在为一种简单的语言编写编译器。
我制作了一个词法分析器/标记器,它接受一个文件并将标记打印在stdout
.
现在我想进行句法分析,但我不知道如何修改我的词法分析器以便将标记作为输入。
- 链表对于大文件效率极低(大约 80MB 的源文件需要大约 1.3GB 的内存)
- 我可以修改我的词法分析器以在每次调用它时给出下一个标记(想法取自 Dragon Book),但我不知道如果在过程中的某个地方我必须返回并读取以前的标记我会做什么。
做这些事情的正确方法是什么?