标签: parser-generator

我们如何获得TypeScript的语法树?

是否有获取编译器语法树的过程.我们已经分配了一个需要访问typescript语法树的项目(这是开源的,所以我们可以看到整个编译器的代码).但我们不知道如何得到它.我一直在阅读互联网上的一些文章,但我找不到一篇用户友好的文章,或用雷曼的术语写的.我相信有人提到我们需要做的第一步是找到解析步骤.但在那之后我们不知道接下来该做什么.

抱歉,这个菜鸟问题.:)

abstract-syntax-tree parser-generator lexer typescript

20
推荐指数
2
解决办法
3247
查看次数

ANTLR4:空白处理

我见过许多使用空格处理的ANTLR语法,如下所示:

WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);
Run Code Online (Sandbox Code Playgroud)

因此将空格分别丢弃发送到隐藏的频道.

用这样的语法:

grammar Not;

start:      expression;
expression: NOT expression
          | (TRUE | FALSE);

NOT:    'not';
TRUE:   'true';
FALSE:  'false';
WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)

有效输入" 不是真 "或" 非假 ",但也是"非真实 ",这不是理想的结果.将语法更改为:

grammar Not;

start:      expression;

expression: NOT WS+ expression
          | (TRUE | FALSE);

NOT:    'not';

TRUE:   'true';
FALSE:  'false';

WS: [ \n\t\r];
Run Code Online (Sandbox Code Playgroud)

解决了这个问题,但我不想在每个规则中手动处理空格.

一般来说,我希望每个令牌之间都有一个空格,但有一些例外(例如' !true '之间不需要空格).

有一个简单的方法吗?

whitespace parsing antlr parser-generator antlr4

19
推荐指数
1
解决办法
1万
查看次数

柠檬的力量与否?

对于语法分析器,我曾经与Bison "玩",它有其优点/缺点.

上周,我在SqLite网站上注意到该引擎已经完成了另一个语法分析器: Lemon

阅读精简文档后听起来很棒.
你有关于这个解析器的一些反馈吗?

无法真正看到谷歌和维基百科上的相关信息(只是一些例子,相同的教程)它似乎不太受欢迎.(Stack Overflow中没有标签[编辑:现在有:P])

c parsing bison parser-generator lemon

18
推荐指数
2
解决办法
3177
查看次数

是否有任何用于功能语言的LL解析器生成器,如Haskell或Scala?

我注意到明显缺乏LL解析器,它们在函数式语言中创建解析器.对于我一直在寻找没有成功的东西的理想发现是为ANTLR样式的LL(*)语法生成Haskell解析器(模式的重新格式化模式),并且惊讶于每个最后的解析器生成器都具有功能我找到的语言目标是某种LR解析器.

我想将我正在研究的这种语言的解析器从ANTLR转换为语言本身的自托管,如果我能用其他函数式语言输入几乎肯定正确的语言,它会有很大的帮助. (最好是我熟悉的,Haskell和Scala),而不是必须从头开始重写它,尽管最后我可能会这样做,因为核心语言很小.

在这一点上,甚至对此的解决方案甚至比我更好奇为什么没有这样的LL(*)甚至LL(k)解析器生成器,但是许多LR生成器,因为LL本身就更容易.

haskell functional-programming scala parser-generator antlr3

18
推荐指数
2
解决办法
2806
查看次数

XText没有提供ANTLR的哪些功能?

我刚刚遇到了非常好的工具Xtext来创建DSL以及IDE进行编辑.我在网上做了一些搜索,发现人们说它没有提供ANTLR的所有功能.我使用ANTLR作为我的解析器生成器.

我甚至不确定ANTLR的哪些功能我需要为我的语言编写完整的解析器,但ANTLR已经存在了很长时间,并且可能支持比Xtext更多的功能.

任何人都可以举一些不能在Xtext语法中指定的例子吗?

eclipse dsl antlr parser-generator xtext

18
推荐指数
1
解决办法
4819
查看次数

否定词法分析器和解析器规则

如何~在ANTLR的词法分析器和解析器规则中使用否定元字符?

antlr parser-generator antlr3

16
推荐指数
1
解决办法
8194
查看次数

分析器的选择

好的,我理解这个问题可能听起来很基于意见,但是由于我有几个特定的​​选择标准,我认为它会很适合SO.所以,我在这里......

我过去曾经使用编译器/解释器构建很多(显然主要是作为一种业余爱好)并且出于某种原因我坚持使用Lex/Yacc(或Flex/Bison,我对他们现在如何称呼它们感到困惑... 大声笑).

然而,由于我发现自己目前正在玩另一个业余爱好者翻译项目,我认为我应该尝试一些不同的东西,以避免我不喜欢Lex/Yacc.

所以,即:

  • 更好的C++ - 友好(比C友好)
  • 好的文档(最好已经实现了一些现有的语法+关于如何编译/使用它们的说明 - 听起来很明显,对吧?)
  • 可能是LALR,LL(*),递归下降,我并不在乎(注意:关于你喜欢哪种类型以及哪种类型的实现会很棒的输入;我从来没有真正理解他们的专业和缺点,说实话,即使我知道他们所指的是什么)
  • 将Lexer部分和Parser语法组合在一个文件中并不坏; 从来没有真正理解为什么它必须分成两部分.
  • 最后但同样重要的是:我总是遇到......问题.我的意思是 - 至少就Lex/Yacc而言,解析错误信息或多或少是神秘的(Syntax Error...... Yuhuu!),很少有人帮助诊断问题.(好吧,除非你是开发翻译的人......哈哈).那么,有没有比Lex/Yacc更好的错误报告

好的,我希望这不是太冗长.我全都耳朵!:-)

c++ parsing lex bison parser-generator

16
推荐指数
2
解决办法
9811
查看次数

关于Python解析器生成器的建议

嘿伙计们,这是我在Stack Overflow上的第一个问题,我想知道我是否可以向那些比我更了解Python和Parser Generators的人提出建议.

我被赋予了一个任务,我必须为一个简单的类C语言创建一个解析器.我可以使用任何编程语言和工具,我希望创建解析器,但我同时学习Python,所以这将是我的首选.

我的Parser必须遵循一些限制.首先,它必须能够读入包含以下信息的文本文件:

kind1 : spelling1
kind2 : spelling2
kind3 : spelling3
      .
      .
      .
kindn : spellingn
Run Code Online (Sandbox Code Playgroud)

每种类型和拼写都指代语言的标记类型和值.该文件是通过语言的词法分析器放置代码示例的结果.

其次,我必须能够自定义解析器的输出.理想情况下,我想输出一个已将类型:拼写列表转换为另一个令牌序列的文件,这些令牌将传递给语言的编译器以转换为MIPS汇编代码.这是我希望解析器能够生成的那种事情的一个小例子:

%function int test
  %variable int x
  %variable int y
%begin
  %if %id y , %id x > %do
  %begin
    %return %num 0
  %end
  %return %num 1
%end
Run Code Online (Sandbox Code Playgroud)

如果有人可以就现有的Python解析器生成器提供建议,并且如果我能够在上面的示例中实现我正在寻找的那种东西,那将是一个很大的帮助.

python parser-generator

14
推荐指数
3
解决办法
5963
查看次数

PEG语法和解析器生成器的局限性?

我很享受YARD的使用:

http://www.ootl.org/yard/

http://code.google.com/p/yardparser/

http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx

我能够构建全功能计算器.我正在评估YARD做PHP解析器.请关注PEG语法和解析器生成器的局限性.非常感谢你!

peg parser-generator yard php-parser

14
推荐指数
2
解决办法
6559
查看次数

Scala RegexParsers中的非贪婪匹配

假设我在Scala中编写了一个基本的SQL解析器.我有以下内容:

class Arith extends RegexParsers {
    def selectstatement: Parser[Any] = selectclause ~ fromclause
    def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
    def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
    def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
    def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
Run Code Online (Sandbox Code Playgroud)

在尝试匹配SELECT foo FROM barselect 语句时,如何防止selectclause因为rep(token)in 而吞噬整个短语~ tokens

换句话说,如何在Scala中指定非贪婪匹配?

为了澄清,我完全知道我可以在String模式本身中使用标准的非贪婪语法(*?)或(+?),但我想知道是否有一种方法可以在def标记内的更高级别指定它.例如,如果我已经定义了这样的标记:

def token: Parser[Any] = stringliteral | numericliteral | columnname
Run Code Online (Sandbox Code Playgroud)

那么如何为def标记内的rep(标记)指定非贪婪匹配?

regex scala parser-generator non-greedy

14
推荐指数
1
解决办法
3277
查看次数