- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 Rust 编写一个 POSIX shell 实现。这带来了一些相当尴尬的要求:
如果词法分析器一次读取一个字符并允许规则设置可以通过词法分析器的字符源查询的内部状态(Rust 不允许填充状态的 C 解决方案),那么这两个要求都可以轻松处理在全局变量中)。我目前的词法分析器就是这样做的。然而,它是 398 行高度重复的代码,包括一些(不充分的)测试。此代码请求自动生成。
自动生成的词法分析器通常使用基于有限自动机的表驱动设计。我对此不是很熟悉,并且想知道先行是这种设计中固有的还是通常不使用。如果通常不使用前瞻,那么我可能可以修改现有的词法分析器生成器来做我想做的事;否则,我可能会坚持使用手写代码。
最佳答案
这可能是一个过于宽泛的问题或生成包含过多意见的答案,这不是 good attribute of an SO question .它非常像是一个问题的合成词,询问现有词法分析器生成器算法的实现、有限自动机的编程、shell 语言的词法要求和 Rust 程序的特征,可能还有其他一些主题。
首先,让我们来处理有关工具生成的词法分析器功能的问题。让我们考虑最常用的一种,flex
GNU 词法分析器生成器。答案是是的;它可以为您构建一个可以执行您想要的操作的词法分析器。它足够灵活并且包含足够多的不同功能来完成这些工作(就像其他类似工具一样)。它会简单明了吗?不必要。该工具使您能够使用内置的读取和有限状态自动机,但您可以提供自己的输入例程、编写自己的状态机,甚至可以处理自写代码片段中的难点(C 或 C++)。在手册、教程网站、教程视频、教科书和 questions here on SO 中有大量关于如何实现此目的的示例。 .
当 flex 使用 C 或 C++ 生成代码时,这对您使用 Rust 编码有何帮助?我们需要一个基于 Rust 的词法分析器。一旦可以进行文献搜索并查看可用的内容。维基百科非常适合列表,并且有一个 list of available parser and lexer generator tools .但是,这些都不会生成 Rust。然而,Rust 中有这样的工具:
由于这两项都是正在进行的实验性工作,您需要自己对其进行评估。
另一种选择是制作您自己的开源工具版本(如 flex
)以与 Rust 一起使用。这可以通过两种方式完成:
flex
的输出进行后处理,将 C 代码转换为 Rust 代码,然后进行编译。这些方法已经实现了好几次,以支持其他新语言的目标。结果,有 a whole raft of compiler generator tools for a myriad of languages .
下一个问题是您手写的词法分析器代码的大小和性质。 There are standardised and recognised ways of programming finite state automata in any language. Experienced programmers would should know the pattern :
while ( NOT <<EOF>> ) {
switch ( next_symbol() ) {
case state_symbol[1]:
....
break;
case state_symbol[2]:
....
break;
default:
error(diagnostic);
}
}
甚至可以在功能上完成:
action[state_symbol[next_symbol()]];
可以手写一个相当紧凑和高效的常规语言解析 FSA 来进行词法分析,但这取决于语言和算法方面的经验。
你宽泛而不精确的问题导致了宽泛而不精确的答案:是的,一切皆有可能,不它不依赖于缓冲和回溯。
关于rust - 表驱动词法分析需要多少缓冲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844877/
我试图了解传递给 setTimeout 的箭头函数如何记住上一个执行上下文中的 this 的值。我知道在执行箭头函数时会使用词法作用域规则查找 this 值。这是否意味着箭头函数关闭变量和 this
这个问题已经有答案了: How does the "this" keyword in Javascript act within an object literal? [duplicate] (4 个
我已阅读 this问题,我想我已经理解了投票最多的答案,但他说 since basically every programming language in wide use today uses le
如何让这段宏发挥预期的作用? -- 我想从词法环境中捕获 p 而不必将其作为参数发送给宏。 (define-syntax-rule (fi a b) (if p a b)) ;--->capt
Program A() { x, y, z: integer; procedure B() { y: integer; y=0;
我正在用 Java 实现自己的链表。节点类只有一个名为“name”的字符串字段和一个名为“link”的节点。现在我有一个测试驱动程序类,它只按顺序插入几个名字。现在,我正在尝试编写一种排序方法来按字母
考虑到这个question SO,其中调用了整个 C# 内存中编译器。只有lexical and syntactic analyzing时是必需的:将文本解析为词素流,检查它们并退出。 在System
我有 2 个场景。 这失败了: class F { public X X { get; set; } } 错误 CS0102:类型“F” ' 已经包含 ' X 的定义| ' 这个有效: class
我有一个用 NodeJS 执行的 .js 文件。这是我的文件的内容: var ctry = "America"; function outer(msg) { console.log(msg +
我对编写汇编程序的概念非常陌生,即使在阅读了大量 Material 之后,我仍然很难理解几个概念。 将源文件实际分解为 token 的过程是什么?我相信这个过程称为词法分析,我已经到处搜索有意义的真实
在 static scoping,标识符可以通过分析/解析源代码来确定(与动态作用域不同,动态作用域或多或少需要了解调用者环境)。 我的问题是这样的,因为静态作用域只需要解析源代码以了解作用域和标识符
编辑:我在第一个答案后更改了示例代码,因为我想出了一个简单的版本来回避相同的问题。 我目前正在学习 Common Lisp 的作用域属性。在我认为我有一个坚实的理解之后,我决定编写一些我可以预测结果的
考虑这段代码: class Bar(object): pass class Foo(object): def bar(self): return Bar() f = Foo() def Bar
将 ES6 箭头函数与词法 this 绑定(bind)结合使用非常棒。 但是,我刚才在使用典型的 jQuery 单击绑定(bind)时遇到了一个问题: class Game { foo() {
将 ES6 箭头函数与词法 this 绑定(bind)结合使用非常好。 但是,我刚才在将它与典型的 jQuery 点击绑定(bind)一起使用时遇到了一个问题: class Game { foo(
我是一名优秀的程序员,十分优秀!