标签: lexer

词法分析者与解析者

词法分析器和解析器在理论上真的有那么不同吗?

讨厌正则表达式似乎很时髦:编码恐怖,另一篇博客文章.

然而,流行的基于乐兴的工具:pygments,geshi或者美化,都使用正则表达式.他们好像有什么东西......

什么时候足够兴奋,什么时候需要EBNF?

有没有人使用这些词法分析器生成的令牌与野牛或antlr解析器生成器?

parsing antlr lexer pygments

299
推荐指数
6
解决办法
10万
查看次数

寻找"标记器","解析器"和"词法分析器"的清晰定义以及它们如何相互关联和使用?

我正在寻找"tokenizer","parser"和"lexer"是什么以及它们如何相互关联的明确定义(例如,解析器是否使用了tokenizer,反之亦然)?我需要创建一个程序,将通过c/h源文件来提取数据声明和定义.

我一直在寻找示例,可以找到一些信息,但我真的很难掌握语法规则,解析树和抽象语法树等基础概念以及它们如何相互关联.最终这些概念需要存储在实际程序中,但1)它们看起来像什么,2)是否有共同的实现.

我一直在关注这些主题和程序,如Lex和Yacc维基百科,但从未经历过编译器类(EE专业),我发现很难完全理解正在发生的事情.

parsing tokenize lexer

134
推荐指数
3
解决办法
3万
查看次数

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

我想学习如何写一个词法分析器.我的大学课程有一个任务,我们必须编写一个解析器(和一个词法分析器一起使用),但这是给我们的,没有任何指示或反馈(超出标记),所以我并没有真正从中学到很多东西.

在搜索了这个主题之后,我只能找到相当高级的写作,这些写作集中在我觉得比我所处的位置提前几步的区域.我想讨论为一种非常简单的语言编写词法分析器的基础知识,我可以将其作为研究更复杂语言标记的基础.

在这个阶段,我并不是对最佳实践或优化技术感兴趣,而是更喜欢专注于基本要素.有什么好的资源让我入门?

language-agnostic compiler-construction lexer

69
推荐指数
2
解决办法
3万
查看次数

在使用像Parsec这样的解析器组合库时,我应该使用词法分析器吗?

在像Haskell的Parsec这样的解析器组合库中编写解析器时,通常有2个选择:

  • 编写词法分析器将String输入拆分为标记,然后执行解析[Token]
  • 直接编写解析器组合器 String

第一种方法通常似乎有意义,因为许多解析输入可以理解为由空格分隔的标记.

在其他地方,我看到人们建议不要进行标记化(或扫描激发,有人称之为),简单性被引用作为主要原因.

lexing和不做之间的一般权衡是什么?

haskell parsec lexer

42
推荐指数
1
解决办法
3822
查看次数

词法分析器与解析器之间的通信

每次我写一个简单的词法分析器和解析器时,我都会遇到同样的问题:词法分析器和解析器应该如何通信?我看到四种不同的方法:

  1. 词法分析器急切地将整个输入字符串转换为标记向量.完成此操作后,向量将被提供给解析器,解析器将其转换为树.这是迄今为止最简单的实现方案,但由于所有令牌都存储在内存中,因此浪费了大量空间.

  2. 每次词法分析器找到一个标记时,它会在解析器上调用一个函数,并传递当前标记.根据我的经验,这只有在解析器可以自然地实现为像LALR解析器这样的状态机时才有效.相比之下,我认为它对于递归下降解析器根本不起作用.

  3. 每次解析器需要一个令牌时,它会向词法分析器询问下一个令牌.由于yield关键字,这在C#中很容易实现,但在C++中却很难实现.

  4. 词法分析器和解析器通过异步队列进行通信.这在"生产者/消费者"这个标题下是众所周知的,它应该简化词法分析器和解析器之间的通信.它是否也优于多核上的其他解决方案?或者lexing太琐碎了?

我的分析听起来不错?还有其他我没有想过的方法吗?在现实世界的编译器中使用了什么?如果像Eric Lippert这样的编译器编写者可以对这个问题有所了解,那真的很酷.

c# c++ compiler-construction parsing lexer

37
推荐指数
2
解决办法
3041
查看次数

逃逸的“&”号在Haskell中意味着什么?

我查看了Haskell 2010报告,发现一个带有&符号的奇怪的转义序列:\&。我找不到解释此转义序列代表什么。它也可能仅位于字符串中。我print "\&"在GHCi中尝试过,它会打印一个空字符串。

syntax haskell escaping lexer

36
推荐指数
1
解决办法
1624
查看次数

穷人为C#"lexer"

我正在尝试用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)

c# regex lexer

32
推荐指数
3
解决办法
2万
查看次数

解析数字和字符串是Lexer的工作吗?

解析数字和字符串是词法分析员的工作吗?

鉴于我正在询问词法分析器是否应该解析输入,这可能听起来也可能听起来不笨.但是,我不确定这实际上是lexer的工作还是解析器的工作,因为为了lex正确,lexer需要首先解析字符串/数字,所以看起来代码会重复,如果解析器执行此操作.

它确实是词法分析员的工作吗?还是应该词法分析器只是分手像串123.456入串123,.,456并让解析器弄清楚的休息吗?使用字符串这样做不会那么简单......

parsing tokenize lexer

31
推荐指数
1
解决办法
3035
查看次数

在解析Javascript时,是什么决定了斜杠的含义?

Javascript有一个棘手的语法来解析.正斜杠可以表示许多不同的东西:除法运算符,正则表达式文本,注释引入者或行注释引入者.最后两个很容易区分:如果斜线后跟一个星号,则会启动多行注释.如果斜杠后跟另一个斜杠,则为行注释.

但消除歧义和正则表达式字面意义的规则正在逃避我.我在ECMAScript标准中找不到它.词汇语法明确分为两部分,InputElementDiv和InputElementRegExp,具体取决于斜杠的含义.但没有什么可以解释何时使用哪个.

当然,可怕的分号插入规则使一切变得复杂.

有没有人有一个明确的代码为lexing Javascript有答案?

javascript lexer

29
推荐指数
4
解决办法
3363
查看次数

用Javascript编写的Lexer?

我有一个项目,用户需要为ui定义一组完全用javascript编写的指令.我需要能够解析一串指令然后将它们转换成指令.是否有任何库可用于解析100%javascript?或者将在javascript中生成的生成器?谢谢!

javascript parsing generator lexer

28
推荐指数
5
解决办法
2万
查看次数