我正在寻找"tokenizer","parser"和"lexer"是什么以及它们如何相互关联的明确定义(例如,解析器是否使用了tokenizer,反之亦然)?我需要创建一个程序,将通过c/h源文件来提取数据声明和定义.
我一直在寻找示例,可以找到一些信息,但我真的很难掌握语法规则,解析树和抽象语法树等基础概念以及它们如何相互关联.最终这些概念需要存储在实际程序中,但1)它们看起来像什么,2)是否有共同的实现.
我一直在关注这些主题和程序,如Lex和Yacc维基百科,但从未经历过编译器类(EE专业),我发现很难完全理解正在发生的事情.
我想学习如何写一个词法分析器.我的大学课程有一个任务,我们必须编写一个解析器(和一个词法分析器一起使用),但这是给我们的,没有任何指示或反馈(超出标记),所以我并没有真正从中学到很多东西.
在搜索了这个主题之后,我只能找到相当高级的写作,这些写作集中在我觉得比我所处的位置提前几步的区域.我想讨论为一种非常简单的语言编写词法分析器的基础知识,我可以将其作为研究更复杂语言标记的基础.
在这个阶段,我并不是对最佳实践或优化技术感兴趣,而是更喜欢专注于基本要素.有什么好的资源让我入门?
在像Haskell的Parsec这样的解析器组合库中编写解析器时,通常有2个选择:
String
输入拆分为标记,然后执行解析[Token]
String
第一种方法通常似乎有意义,因为许多解析输入可以理解为由空格分隔的标记.
在其他地方,我看到人们建议不要进行标记化(或扫描或激发,有人称之为),简单性被引用作为主要原因.
lexing和不做之间的一般权衡是什么?
每次我写一个简单的词法分析器和解析器时,我都会遇到同样的问题:词法分析器和解析器应该如何通信?我看到四种不同的方法:
词法分析器急切地将整个输入字符串转换为标记向量.完成此操作后,向量将被提供给解析器,解析器将其转换为树.这是迄今为止最简单的实现方案,但由于所有令牌都存储在内存中,因此浪费了大量空间.
每次词法分析器找到一个标记时,它会在解析器上调用一个函数,并传递当前标记.根据我的经验,这只有在解析器可以自然地实现为像LALR解析器这样的状态机时才有效.相比之下,我认为它对于递归下降解析器根本不起作用.
每次解析器需要一个令牌时,它会向词法分析器询问下一个令牌.由于yield
关键字,这在C#中很容易实现,但在C++中却很难实现.
词法分析器和解析器通过异步队列进行通信.这在"生产者/消费者"这个标题下是众所周知的,它应该简化词法分析器和解析器之间的通信.它是否也优于多核上的其他解决方案?或者lexing太琐碎了?
我的分析听起来不错?还有其他我没有想过的方法吗?在现实世界的编译器中使用了什么?如果像Eric Lippert这样的编译器编写者可以对这个问题有所了解,那真的很酷.
我查看了Haskell 2010报告,发现一个带有&符号的奇怪的转义序列:\&
。我找不到解释此转义序列代表什么。它也可能仅位于字符串中。我print "\&"
在GHCi中尝试过,它会打印一个空字符串。
我正在尝试用C#编写一个非常简单的解析器.
我需要一个词法分析器 - 让我将正则表达式与标记相关联的东西,所以它读取正则表达式并给我回符号.
看起来我应该能够使用正则表达式进行实际繁重的工作,但我看不出一个简单的方法.首先,Regex似乎只能处理字符串,而不是流(为什么会这样!?!?).
基本上,我想要一个以下接口的实现:
interface ILexer : IDisposable
{
/// <summary>
/// Return true if there are more tokens to read
/// </summary>
bool HasMoreTokens { get; }
/// <summary>
/// The actual contents that matched the token
/// </summary>
string TokenContents { get; }
/// <summary>
/// The particular token in "tokenDefinitions" that was matched (e.g. "STRING", "NUMBER", "OPEN PARENS", "CLOSE PARENS"
/// </summary>
object Token { get; }
/// <summary>
/// Move to the next token …
Run Code Online (Sandbox Code Playgroud) 解析数字和字符串是词法分析员的工作吗?
鉴于我正在询问词法分析器是否应该解析输入,这可能听起来也可能听起来不笨.但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了lex正确,lexer需要首先解析字符串/数字,所以看起来代码会重复,如果解析器执行此操作.
它确实是词法分析员的工作吗?还是应该词法分析器只是分手像串123.456
入串123
,.
,456
并让解析器弄清楚的休息吗?使用字符串这样做不会那么简单......
Javascript有一个棘手的语法来解析.正斜杠可以表示许多不同的东西:除法运算符,正则表达式文本,注释引入者或行注释引入者.最后两个很容易区分:如果斜线后跟一个星号,则会启动多行注释.如果斜杠后跟另一个斜杠,则为行注释.
但消除歧义和正则表达式字面意义的规则正在逃避我.我在ECMAScript标准中找不到它.词汇语法明确分为两部分,InputElementDiv和InputElementRegExp,具体取决于斜杠的含义.但没有什么可以解释何时使用哪个.
当然,可怕的分号插入规则使一切变得复杂.
有没有人有一个明确的代码为lexing Javascript有答案?
我有一个项目,用户需要为ui定义一组完全用javascript编写的指令.我需要能够解析一串指令然后将它们转换成指令.是否有任何库可用于解析100%javascript?或者将在javascript中生成的生成器?谢谢!