我正在尝试在scala中构造一个解析器,它可以解析类似SQL的字符串.我已经掌握了基础知识并且可以解析类似的东西:
select id from users where name = "peter" and age = 30 order by lastname
Run Code Online (Sandbox Code Playgroud)
但现在我想知道如何解析嵌套和类,即
select name from users where name = "peter" and (age = 29 or age = 30)
Run Code Online (Sandbox Code Playgroud)
我的'combinedPredicate'的当前产量如下:
def combinedPredicate = predicate ~ ("and"|"or") ~ predicate ^^ {
case l ~ "and" ~ r => And(l,r)
case l ~ "or" ~ r => Or(l,r)
}
Run Code Online (Sandbox Code Playgroud)
我尝试以递归方式引用内部的combinedPredicate生成,但这会导致堆栈溢出.
顺便说一句,我只是在这里试验......没有实现整个ansi-99规范;)
有没有办法为堆管理指定我自己的allocator/deallocator函数而不是malloc()/ free()用于bison中的纯推送解析器?
我被建议使用Parser Generator为我的域特定语言创建解析器.
理想情况下,我希望它输出一个Objective-C解析器并使用BNF输入来描述语言.
似乎很少有选择..是否有可能使用一个更受欢迎的具有目标C的解析器生成器?
谢谢!
compiler-construction parsing programming-languages objective-c parser-generator
有没有人知道是否有一些教程和/或网上使用GNU Bison和Java的例子.我在网上搜索过.但我没有找到任何东西.我试图实现一个例子,但我无法编译它(因为我也需要一个词法分析器).这是我的例子:
%{
static void main(String[] args) {
yyparse();
}
%}
%union {
int number;
char operator;
}
%language "Java"
%token<number> NUMBER
%token<operator> OPERATOR
%type <number> exp
%left OPERATOR
%%
input
: /* Empty string */
| exp { System.out.print("Result >> " + $1); }
;
exp
: NUMBER
| exp OPERATOR exp {
switch($2) {
case '+': $$ = $1 + $3; break;
case '-': $$ = $1 - $3; break;
case '*': $$ = $1 * $3; break; …Run Code Online (Sandbox Code Playgroud) 在项目中处理多个Flex/Bison解析器的最佳方法是什么?
我写了一个解析器,现在我需要在同一个项目中使用第二个解析器.到目前为止,在parser1.y我插入main(..)方法的第三部分并yyparse从那里调用.
我想获得是一种有两个不同的解析器(什么parser1.y和parser2.y),并能够从外部函数中使用它们(让我们假设main在main.cpp).
我应该使用哪些预防措施来导出文件yyparse外的函数.y以及如何处理两个解析器?
PS.我正在使用g ++编译而不是Flex和Bison的C++版本,我想保持这种方式(因此避免将解析器封装在对象中).
我使用正常的空白分隔到隐藏的通道,但我有一个规则,我想包括任何空格以便以后处理,但我发现的任何例子都需要一些非常奇怪的手动编码.
没有简单的选项可以从多个渠道中读取,例如从一开始就将空白放在那里的选项.
防爆.这是WhiteSpace词法分析器规则
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
这是我的规则,我想包括空格
raw : '{'? (~('{'))*;
Run Code Online (Sandbox Code Playgroud)
基本上它捕获所有规则来捕获与其他模式不匹配的其他规则的内容,因此我需要原始流.
我希望有一个{$channel==DEFAULT || $channel==HIDDEN}语法示例,但找不到任何.
我的目标是C#,但如果需要,我可以重写Java示例.
我正在尝试lint为C/AL编程语言创建某种工具.所以基本上我需要对源代码执行语法和词法分析.我打算从头开始编写解析器,但后来发现有很多工具可以帮助自动生成这些解析器.
我需要性能,因为在一个部分中检查20兆字节的代码是正常情况,我需要该工具可以通过自定义规则进行扩展.所以我决定使用JavaScript.
哪一个给我更多的解析性能?也许不是比较库,而是算法?
哪一个更适合我的需求(解析通用编程语言)?
更新: 我发现了类似的问答:
POSIX shell命令语言不易解析,主要是因为lexing和解析之间的紧密耦合.
但是,解析表达式语法(PEG)通常是无扫描的.通过结合lexing和解析,我似乎可以避免这些问题.我正在使用的语言(Rust)有一个维护良好的PEG库.但是,我知道有三个困难可能使得使用这个库变得不切实际:
PEG是否适合在给定这些要求的情况下解析shell命令语言,或者是一个手写的递归下降解析器更适合?
在Scala中,我使用Parser Combinators库实现了语法.现在,我想要做的是从解析器组合器库中生成给定语法的随机字符串.
在我看来,ScalaCheck库在某种程度上与Parser Combinators相反,因为它结合了生成器而不是解析器.
是否已经有一种使用Parser Combinators或ScalaCheck生成字符串的方法,或者是否有直接的方法将Parser Combinator转换为生成器?
code-generation scala parser-generator quickcheck scalacheck
parser-generator ×10
bison ×3
parsing ×3
peg ×2
scala ×2
yacc ×2
antlr ×1
antlr3 ×1
c ×1
glr ×1
grammar ×1
java ×1
javascript ×1
lex ×1
lexer ×1
objective-c ×1
performance ×1
quickcheck ×1
rust ×1
scalacheck ×1
shell ×1