标签: lexer

寻求用于创建无上下文解析器语法的交互式实用程序

我想要一个实用程序,我可以给一段文本(在文本框中)并尝试解析器语法(通过编辑类似的BNF)和令牌结构,同时我可以看到解析树的外观(如果它是无法使用我当前的语法解析文本,我会看到它停止的位置).

关键词是互动.我可以使用flex和bison来做到这一点,但我不得不重新创建我的词法分析器和解析器.

那里有这样的东西吗?我还没找到.理想情况下它应该在Linux中工作并且是免费的,如果这不是一个选项,它仍然是有意义的.

parsing bnf lexer context-free-grammar

4
推荐指数
1
解决办法
764
查看次数

为什么有些语言需要在调用之前在代码中声明函数?

假设你有这个伪代码

do_something();

function do_something(){
   print "I am saying hello.";
}
Run Code Online (Sandbox Code Playgroud)

为什么有些编程语言需要调用do_something()才能显示在函数声明下面才能运行代码?

comparison scope programming-languages language-comparisons lexer

4
推荐指数
1
解决办法
127
查看次数

词法分析器/解析器歧义

词法分子如何解决这种模糊性?

/*/*/
Run Code Online (Sandbox Code Playgroud)

它是如何不只是说,哦,是的,这是一个多行评论的开始,接着是另一个多行评论.

一个贪婪的词法分析器不会只返回以下令牌吗?

  • /*
  • /*
  • /

我正在为CSS编写一个shift-reduce解析器,然而这个简单的注释事情就是我的方式.如果您不想获得更多背景信息,可以阅读此问题.

UPDATE

很抱歉首先将其删除.我打算在这个表单中添加CSS语言的扩展,/* @ func ( args, ... ) */但我不想混淆一个理解CSS但不是我的扩展注释的编辑器.这就是为什么词法分析者不能忽视评论.

lexer

4
推荐指数
2
解决办法
1444
查看次数

bison/flex 中的简单 XML 解析器

我想使用 bison/flex创建简单的 xml 解析器。我不需要验证、注释、参数,只需要<tag>value</tag>,其中可以是数字、字符串或其他<tag>value</tag>

例如:

<div>
  <mul>
    <num>20</num>
    <add>
      <num>1</num>
      <num>5</num>
    </add>
  </mul>
  <id>test</id>
</div>
Run Code Online (Sandbox Code Playgroud)

如果有帮助,我知道可能出现的所有标签的名称。我知道给定标签可以容纳多少个子标签。是否可以创建可以执行以下操作的野牛解析器:

- new Tag("num", 1)           // tag1
- new Tag("num", 5)           // tag2
- new Tag("add", tag1, tag2)  // tag3
- new Tag("num", 20)          // tag4
- new Tag("mul", tag4, tag3)
...
- root = top_tag
Run Code Online (Sandbox Code Playgroud)

标签和子标签数量:

  • 数量:1(仅值)
  • str:1(唯一值)
  • 添加 | 子 | 多| div: 2 (num | str | tag, num | str | tag)

你能帮我语法来创建上面给出的 …

bison lexer xml-parsing flex-lexer

4
推荐指数
1
解决办法
8402
查看次数

强制CL-Lex阅读整个单词

我正在使用CL-Lex实现词法分析器(作为CL-YACC的输入),我的语言有几个关键词,如"let"和"in".然而,虽然词法分析器识别出这样的关键词,但它确实太多了.当它找到诸如"init"之类的单词时,它将第一个标记返回为IN,而它应该为"init"字返回一个"CONST"标记.

这是词法分析器的简单版本:

(define-string-lexer lexer
     (...)
     ("in"   (return (values :in $@)))
     ("[a-z]([a-z]|[A-Z]|\_)"  (return (values :const $@))))
Run Code Online (Sandbox Code Playgroud)

如何强制词法分析器完全读取整个单词,直到出现一些空格?

lisp lexer

4
推荐指数
1
解决办法
715
查看次数

DFA最小化

我有一个关于DFA最小化的问题.所以我使用了众所周知的技术将正则表达式转换为NFA,然后使用goto/closure算法从中构造DFA.现在问题是如何最小化它?我在这里看过关于它的文章:http://www.youtube.com/watch? v = T9Z66NF5YRk ,我仍然无法理解.什么是DFA最小化?这只是合并IDENTICAL状态(状态在相同的字符上进入相同的状态)还是不同的东西?

所以,我开始使用以下语法:

%digit = '0'..'9'
%letter = 'a'..'z' | 'A'..'Z'
%exponent = ("e" | "E") ("+" | "-")? digit+

T_INT = digit+
T_FLOAT = T_INT exponent
T_IDENTIFIER = (letter | "$" | "_") (letter | "$" | "_" | digit)*
Run Code Online (Sandbox Code Playgroud)

最终得到以下DFA(表示为JSON):

{
    "START": [{
        "type": "range",
        "from": 36,
        "to": 36,
        "shift": "1"
    }, {
        "type": "range",
        "from": 48,
        "to": 57,
        "shift": "2"
    }, {
        "type": "range",
        "from": 65,
        "to": 90,
        "shift": "1"
    }, …
Run Code Online (Sandbox Code Playgroud)

regex lexer dfa nfa

4
推荐指数
2
解决办法
2566
查看次数

如果我已经实现了基本的正则表达式匹配器,我如何实现词法分析器?

我正在尝试实现一个有趣的词法分析器.我已经实现了一个基本的正则表达式匹配器(首先将模式转换为NFA,然后转换为DFA).现在我对如何继续我一无所知.

我的词法分析者将会获取一系列令牌及其相应的正则表达式.用于创建词法分析器的一般算法是什么?

我想过(或)所有的正则表达式,但后来我无法确定哪个特定的令牌匹配.即使我扩展我的正则表达式模块以返回匹配成功时匹配的模式,我如何在匹配器中实现先行?

regex algorithm lexer

4
推荐指数
1
解决办法
1573
查看次数

Antlr 词法分析器对出现范围的支持?

Antlr 的词法分析器支持 Kleene 闭包 ( *) 和正 Kleene 闭包 ( +),分别指示字符在非正/正时间出现的次数。Antlr 的词法分析器是否有一个结构来支持某个字符的一系列出现,就像正则表达式一样,比如'a' {8,16}

antlr lexer

4
推荐指数
1
解决办法
865
查看次数

Lexer意外地标记了

以下非常简单的示例语法不像我预期的那样(根本没有).

Declaration :   'VAR';
Letter: ('A'..'Z');

message :   Declaration Letter+;
Run Code Online (Sandbox Code Playgroud)

我所期望的结果是,任何字母序列都会作为单个字母而形成,并且序列"VAR"将被作为单个标记.

当我查看ANTLRWorks interperter时,我看到以下结果:

  • VARA解析message -> "VAR", "A"(预期)
  • VARVA不解析(MismatchedTokenException(-1!= 5).词法分析器命中第二个VA并尝试标记Declaration.预期:message -> "VAR", "V", "A"
  • VARVPP解析message -> "VAR", "V", "P", "P"(预期)
  • VARVALL解析message -> "VAR", "VALL".

我想帮助理解这种行为,并建议我如何解决这个问题.

特别:

  • 为什么词法分析器会尝试将所有字符串标记VA为"声明",如果后跟一个字母?
  • 为什么词法分析器不会尝试使用以V?开头的所有字符串来执行此操作?
  • 如果有一个额外的角色,为什么词法分子不会尝试这样做呢?
  • 我应该如何改变这种语法来解析我的预期方式?

antlr lexer antlr3

4
推荐指数
1
解决办法
174
查看次数

如何使用Clang作为预处理器

我正在做论文,我必须将源代码解析并标记为单个函数.对于每个函数,我想提取类型的名称,称为函数名称和类型转换.铿锵声是这种工作的正确工具吗?如果是,我该怎么做?

下面是一个简单的C函数.粗体是我想要的提取项目:

static char func1(unsigned int a, struct foo *b)
{
    int c = 0;
    struct bar *d;

    if (a == 0) {
        d = func2((int) a);
    } else {
        c = func3((struct bar *) b);
    }

    return c;
}

preprocessor llvm lexer llvm-clang

4
推荐指数
1
解决办法
2736
查看次数