问题标签 [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.
c - 如何手动编写(shell)词法分析器
我正在开发一个 shell,一个类似 bash 的小型 shell,没有脚本(如果 while ...)我必须手动制作词法分析器/解析器(LL)。
所以词法分析器会将命令(char *cmd)转换为链表(t_list *list)。并且 LL 解析器将使用语法将链表 ( t_list *list ) 转换为 AST (二叉树t_btree *root )
所以,我知道如何制作 LL 解析器,但我不知道如何标记我的命令。
例如:ps | grep ls >> file ; make && ./a.out
=>'ps' '|' 'grep' 'ls' '>>' 'file' ';' ''make '&&' './a.out'
谢谢。
(我不想使用任何发电机)
javascript - 解析 Javascript 时,什么决定了斜线的含义?
Javascript 有一个难以解析的语法。正斜杠可以表示许多不同的东西:除法运算符、正则表达式文字、注释介绍器或行注释介绍器。最后两个很容易区分:如果斜线后面跟着一个星号,它开始一个多行注释。如果斜线后面跟着另一个斜线,则它是行注释。
但是消歧除法和正则表达式文字的规则让我无法理解。我在ECMAScript 标准中找不到它。在那里,词法语法被明确分为两部分,InputElementDiv 和 InputElementRegExp,这取决于斜杠的含义。但是没有什么可以解释什么时候使用哪个。
当然,可怕的分号插入规则使一切变得复杂。
有没有人有一个明确的代码来解释 Javascript 的例子?
javascript - 简单的递归下降解析器?
我正在为编译成 JS 的模板语言编写解析器(如果相关的话)。我从一些简单的正则表达式开始,这似乎可以工作,但是正则表达式非常脆弱,所以我决定改写一个解析器。我首先编写了一个简单的解析器,它通过推送/弹出堆栈来记住状态,但事情一直在升级,直到我手头有一个递归下降解析器。
不久之后,我比较了我之前所有的解析方法的性能。递归下降解析器是迄今为止最慢的。我被困住了:是否值得为简单的事情使用递归下降解析器,还是我有理由走捷径?我很想走纯正则表达式路线,它速度非常快(几乎比 RD 解析器快 3 倍),但在某种程度上非常笨拙且无法维护。我认为性能并不是非常重要,因为编译的模板被缓存了,但是递归下降解析器是每项任务的正确工具吗?我想我的问题更像是一个哲学问题:为了性能牺牲可维护性/灵活性到什么程度值得?
antlr - ANTLR 可以根据以下字符区分词法分析器规则吗?
为了解析测试文件,我想允许标识符以数字开头。
我的规则是:
但是,我还需要匹配此文件中的数字。我的规则是:
显然 Antlr 不会让我这样做,因为 INT 永远不会匹配。
有没有办法允许这样做?具体来说,我想匹配一个 INTEGER 后跟一个没有空格的 ID 作为一个 ID,并且只有在它后面跟着一个空格时才创建一个 INT 令牌。
例如:
antlr - 如何让 Antlr Parser 规则从默认和隐藏通道中读取
我在隐藏通道中使用了普通的空格分隔,但是我有一个规则,我想包含任何空格以供以后处理,但是我发现的任何示例都需要一些非常奇怪的手动编码。
是否没有从多个通道读取的简单选项,例如从一开始就将空格放在那里的选项。
前任。这是 WhiteSpace 词法分析器规则
这是我想包含空格的规则
基本上,捕获所有与其他规则不匹配的内容以由另一个模式处理,因此我需要原始流。
我希望有一个{$channel==DEFAULT || $channel==HIDDEN}
语法示例,但找不到。
我的目标是 C#,但如果需要,我可以重写 Java 示例。
c# - 解析自定义数据标记并用 C# 中的值替换
我有大约 10 条记录中的数据,我希望能够定义返回此数据的字符串的布局,并可以选择保留一些数据。我的想法是使用枚举为我的标记/字段提供整数值,然后使用类似{0}{1}{2}{3}
或复杂的格式{4} - {3}{1} [{8}]
。标记的含义与我的数据库中的字段有关。例如,我有这个与付款相关的代币的枚举。
帐户掩码是一个类似 VXXXXX1234 的字符串,其中 V 代表签证,1234 是卡的最后 4 位数字。有时客户想要 V,有时他们想要第一位数字(将卡片类型转换为第一位数字很容易)。
我的目标是创建可重用的东西,以使用格式字符串中的标记生成字符串,然后使用与标记内的数字相关联的数据对数据进行就地替换。
因此,例如,如果我想定义格式,则使用上面的掩码和我的枚举9{2}{1}{4:[0:0000000000]}
如果项目编号是 678934
然后将转换为 9412340000678934 ,其中令牌 4 的内部部分成为String.Format
该值的 a 的定义。此外,放置在令牌周围的数据将被忽略并保留在适当的位置。
我的问题涉及字符串的操作和最佳实践。有人告诉我,如果您要即时创建正则表达式,它们的成本可能会很高。作为一名 CS 专业的学生,我觉得“正确”(无论多么复杂)的解决方案是为我的令牌制作一个词法分析器/解析器。我没有用 C# 编写词法分析器/解析器的经验,所以我不确定围绕它的最佳实践。我正在这里寻找有关高效且易于调整的系统的指导。
parsing - “lexer”这个词是“parser”这个词的同义词吗?
标题是问题:“lexer”和“parser”这两个词是同义词,还是它们不同?维基百科似乎可以互换使用这些词,但英语不是我的母语,所以我不能确定。
parsing - 了解编程语言的内部工作原理
哪里是开始学习像 C 这样的编程语言的内部工作的好地方?
它会学习解析器/词法分析器的工作原理吗?
parsing - 使用 Java CUP 生成解析树
我正在使用 CUP 和 JFlex 来验证表达式语法。我有基本的功能:我可以判断一个表达式是否有效。
下一步是实现简单的算术运算,例如“加 1”。例如,如果我的表达式是“1 + a”,那么结果应该是“2 + a”。我需要访问解析树才能做到这一点,因为简单地识别一个数字项是行不通的:将 1 添加到 "(1 + a) * b" 的结果应该是 "(1 + a) * b + 1" ,而不是“(2 + a)* b”。
有没有人有一个生成解析树的 CUP 示例?我想我可以从那里拿走它。
作为额外的奖励,有没有办法使用 JFlex 获取表达式中所有标记的列表?似乎是一个典型的用例,但我不知道该怎么做。
编辑:找到关于堆栈溢出的有希望的线索: 从解析器创建抽象树问题
CUP和AST的讨论:
http://pages.cs.wisc.edu/~fischer/cs536.s08/lectures/Lecture16.4up.pdf
具体来说,这一段:
解析器返回的符号与语法的开始符号相关联,并包含整个源程序的 AST
这无济于事。如果 Symbol 类没有任何指向其子级的导航指针,如何遍历给定Symbol实例的树?换句话说,它看起来或行为不像树节点:
f# - 有没有办法使用 fslex/Lexing.LexBuffer 执行前瞻
我正在使用 fslex 并且在我的标记器规则之一中,我需要查找下一个字符,以便我可以决定是继续使用令牌还是停止、放松并让前一个规则使用它。
我花了一些时间检查它的源代码,看起来唯一的方法是编译一个公开一些内部方法的版本。也许这里有人有更好的解决方案?