Tag: 词法分析器

词法分析器和分析器之间的通信

每次我写一个简单的词法分析器,我都会碰到同样的问题:词法分析器和parsing器应该如何交stream? 我看到了四种不同的方法: 词法分析器急切地将整个inputstring转换为一个标记向量。 一旦完成,vector被送到parsing器,parsing器将其转换成树。 这是迄今为止最简单的解决scheme,但是由于所有的令牌都存储在内存中,所以浪费了大量的空间。 词法分析器每次find一个标记时,都会在parsing器上调用一个函数,传递当前的标记。 根据我的经验,这只有在parsing器可以像LALRparsing器那样自然地被实现为状态机时才有效。 相比之下,我认为它不会用于recursion下降parsing器。 每一次parsing器都需要一个标记,它会要求词法分析器进行下一个标记。 由于yield关键字,这在C#中很容易实现,但在C ++中很难实现。 词法分析器和parsing器通过asynchronous队列进行通信。 这在“生产者/消费者”的标题下是众所周知的,它应该简化词法分析器和parsing器之间的通信。 它是否也超越了其他多核解决scheme? 还是太轻松了? 我的分析是否正确? 有没有其他的方法我没有想到? 在实际编译器中使用什么? 如果像Eric Lippert这样的编译器作者能够解释这个问题,这将是非常酷的。

我在哪里可以学习编写词法分析器的基础知识?

我想学习如何编写一个词法分析器。 我的大学课程有一个任务,我们必须写一个parsing器(和一个词法分析器),但是这个给我们没有任何指示或反馈(超出标记),所以我没有真正从中学到很多东西。 在寻找这个主题后,我只能find相当先进的写作,重点放在我觉得比我所在的领先几步的地方。 我想讨论一下为一个非常简单的语言编写一个词法分析器的基础知识,我可以用它来作为调查更加复杂的语言的基础。 在这个阶段,我并不是对最佳实践或优化技术真正感兴趣,而是倾向于关注基本要素。 有什么好的资源让我开始?

寻找“分词器”,“分析器”和“词法分析器”是什么以及它们如何相互关联和使用的明确定义?

我正在寻找“tokenizer”,“parser”和“lexer”是什么以及它们是如何相互关联(例如,parsing器使用标记器,反之亦然)的明确定义? 我需要创build一个程序将通过c / h源文件来提取数据的声明和定义。 我一直在寻找例子,可以find一些信息,但我真的很努力地掌握像语法规则,分析树和抽象语法树,以及它们是如何相互关联的基本概念。 最终,这些概念需要存储在一个实际的程序中,但是1)它们看起来像什么,2)是否有常见的实现。 我一直在维基百科关于Lex和Yacc这些主题和程序,但从来没有经历过一个编译器类(EE专业)我发现很难完全理解是怎么回事。

ANTLR词法分析器如何消除其规则(或为什么我的分析器产生“不匹配的input”错误)?

注意:这是一个自我回答的问题 ,旨在提供有关ANTLR用户最常犯的错误之一的参考。 当我testing这个非常简单的语法时: grammar KeyValues; keyValueList: keyValue*; keyValue: key=IDENTIFIER '=' value=INTEGER ';'; IDENTIFIER: [A-Za-z0-9]+; INTEGER: [0-9]+; WS: [ \t\r\n]+ -> skip; 通过以下input: foo = 42; 我结束了以下运行时错误: 第1行:6个不匹配的input“42”,期望INTEGER 第1行:8个不匹配的input';' 期待'=' 为什么在这种情况下,ANTLR不认为42是INTEGER ? 它应该匹配模式[0-9]+就好了。 如果我将INTEGER和IDENTIFIER的定义顺序颠倒INTEGER ,似乎可行,但为什么顺序是重要的呢?

词法分析器与parsing器

词法分析器和parsing器在理论上真的不一样吗? 讨厌正则expression式似乎很时髦: 编码恐怖 , 另一篇博客文章 。 然而,stream行的基于乐谱的工具: pygments , geshi或者美化 ,都使用正则expression式。 他们似乎什么都得不到 什么时候足够轻松,什么时候需要EBNF? 有没有人使用这些词法分析器生成的令牌与野牛或antlr语法分析器?