是否有获取编译器语法树的过程.我们已经分配了一个需要访问typescript语法树的项目(这是开源的,所以我们可以看到整个编译器的代码).但我们不知道如何得到它.我一直在阅读互联网上的一些文章,但我找不到一篇用户友好的文章,或用雷曼的术语写的.我相信有人提到我们需要做的第一步是找到解析步骤.但在那之后我们不知道接下来该做什么.
抱歉,这个菜鸟问题.:)
我见过许多使用空格处理的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 '之间不需要空格).
有一个简单的方法吗?
我注意到明显缺乏LL解析器,它们在函数式语言中创建解析器.对于我一直在寻找没有成功的东西的理想发现是为ANTLR样式的LL(*)语法生成Haskell解析器(模式的重新格式化模式),并且惊讶于每个最后的解析器生成器都具有功能我找到的语言目标是某种LR解析器.
我想将我正在研究的这种语言的解析器从ANTLR转换为语言本身的自托管,如果我能用其他函数式语言输入几乎肯定正确的语言,它会有很大的帮助. (最好是我熟悉的,Haskell和Scala),而不是必须从头开始重写它,尽管最后我可能会这样做,因为核心语言很小.
在这一点上,甚至对此的解决方案甚至比我更好奇为什么没有这样的LL(*)甚至LL(k)解析器生成器,但是许多LR生成器,因为LL本身就更容易.
haskell functional-programming scala parser-generator antlr3
我刚刚遇到了非常好的工具Xtext来创建DSL以及IDE进行编辑.我在网上做了一些搜索,发现人们说它没有提供ANTLR的所有功能.我使用ANTLR作为我的解析器生成器.
我甚至不确定ANTLR的哪些功能我需要为我的语言编写完整的解析器,但ANTLR已经存在了很长时间,并且可能支持比Xtext更多的功能.
任何人都可以举一些不能在Xtext语法中指定的例子吗?
好的,我理解这个问题可能听起来很基于意见,但是由于我有几个特定的选择标准,我认为它会很适合SO.所以,我在这里......
我过去曾经使用编译器/解释器构建很多(显然主要是作为一种业余爱好)并且出于某种原因我坚持使用Lex/Yacc(或Flex/Bison,我对他们现在如何称呼它们感到困惑... 大声笑).
然而,由于我发现自己目前正在玩另一个业余爱好者翻译项目,我认为我应该尝试一些不同的东西,以避免我不喜欢Lex/Yacc.
所以,即:
Syntax Error...... Yuhuu!),很少有人帮助诊断问题.(好吧,除非你是开发翻译的人......哈哈).那么,有没有比Lex/Yacc更好的错误报告?好的,我希望这不是太冗长.我全都耳朵!:-)
嘿伙计们,这是我在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解析器生成器提供建议,并且如果我能够在上面的示例中实现我正在寻找的那种东西,那将是一个很大的帮助.
我很享受YARD的使用:
http://code.google.com/p/yardparser/
http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx
我能够构建全功能计算器.我正在评估YARD做PHP解析器.请关注PEG语法和解析器生成器的局限性.非常感谢你!
假设我在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(标记)指定非贪婪匹配?
parser-generator ×10
antlr ×3
parsing ×3
antlr3 ×2
bison ×2
scala ×2
antlr4 ×1
c ×1
c++ ×1
dsl ×1
eclipse ×1
haskell ×1
lemon ×1
lex ×1
lexer ×1
non-greedy ×1
peg ×1
php-parser ×1
python ×1
regex ×1
typescript ×1
whitespace ×1
xtext ×1
yard ×1