我正在使用Java编写一个编译器设计项目.完成词法分析(使用jflex),我想知道哪种类似yacc的工具最适合(最有效,最容易使用等)进行语法分析以及原因.
我正在尝试使用一种代码生成器来帮助对传统的C/C++混合项目进行单元测试.我没有发现任何一种独立的工具可以从声明中生成存根代码.所以我决定建立一个,它应该不那么难.
拜托,任何人都可以给我一个标准的语法链接,更好地用yacc语言描述.
希望我不是重新发明轮子,请在这种情况下帮助我.
最诚挚的问候,凯文
实际上,也许不是全面的Lex/Yacc.我正在实现一个命令解释器前端来管理webapp.我正在寻找一些能够进行语法定义并将其转换为直接调用我的对象上的方法的解析器的东西.类似于ASP.NET MVC如何确定要调用哪个控制器方法,以及如何编写参数.
因此,如果用户在命令提示符下键入"create foo",它应该透明地调用方法:
private void Create(string id) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
哦,如果它可以从这些控制器方法的(例如)属性生成帮助文本,那也是很棒的.
.NET有一个很好的解析器生成器(想想lex/yacc或antlr)吗?任何拥有不会吓唬律师的执照的人?很多LGPL,但我正在研究嵌入式组件,有些组织对我采用LGPL依赖感到不舒服.
我听说奥斯陆可能提供此功能,但我不确定它是构建时依赖还是运行时依赖.任何人都可以澄清奥斯陆会提供什么吗?
更新
我真正想要的是一个解析器生成器,它只是一个构建时依赖项.看起来ANTLR有一个运行时组件.
我正在尝试构建一个Lisp语法.容易,对吗?显然不是.
我提出这些输入并收到错误......
( 1 1)
23 23 23
ui ui
Run Code Online (Sandbox Code Playgroud)
这是语法......
%%
sexpr: atom {printf("matched sexpr\n");}
| list
;
list: '(' members ')' {printf("matched list\n");}
| '('')' {printf("matched empty list\n");}
;
members: sexpr {printf("members 1\n");}
| sexpr members {printf("members 2\n");}
;
atom: ID {printf("ID\n");}
| NUM {printf("NUM\n");}
| STR {printf("STR\n");}
;
%%
Run Code Online (Sandbox Code Playgroud)
就像我所知,我需要一个非终端定义为一个程序,整个解析树可以挂起.但我尝试了它似乎没有用.
编辑 - 这是我的"顶级终端"方法:
program: slist;
slist: slist sexpr | sexpr;
Run Code Online (Sandbox Code Playgroud)
但它允许以下问题:
( 1 1
Run Code Online (Sandbox Code Playgroud)
Edit2:FLEX代码是......
%{
#include <stdio.h>
#include "a.yacc.tab.h"
int linenumber;
extern int yylval;
%}
%% …Run Code Online (Sandbox Code Playgroud) 我正在开发的软件库使用了大量的yacc,我不需要处理它.有时候我认为这有助于理解我发现的一些问题,但大部分时间我都可以完全忽略yacc.
我的问题是有足够的新项目仍然使用yacc保证我需要学习的时间吗?
编辑:鉴于响应主要是支持学习Yacc,是否有类似的语言,你会推荐yacc?
当我尝试在以下文件上使用yacc时,我得到错误冲突:1 shift/reduce如何找到并修复冲突?
/* C-Minus BNF Grammar */
%token ELSE
%token IF
%token INT
%token RETURN
%token VOID
%token WHILE
%token ID
%token NUM
%token LTE
%token GTE
%token EQUAL
%token NOTEQUAL
%%
program : declaration_list ;
declaration_list : declaration_list declaration | declaration ;
declaration : var_declaration | fun_declaration ;
var_declaration : type_specifier ID ';'
| type_specifier ID '[' NUM ']' ';' ;
type_specifier : INT | VOID ;
fun_declaration : type_specifier ID '(' params ')' compound_stmt ;
params : param_list …Run Code Online (Sandbox Code Playgroud) 我试图将一个结构作为与Bison联合的一部分包含在内,但是我在%union中的'struct node args'上得到一个错误:
parser.y:17: error: field ‘args’ has incomplete type
Run Code Online (Sandbox Code Playgroud)
代码:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
Run Code Online (Sandbox Code Playgroud)
谁知道我做错了什么?
我正在尝试使用YACC和xcode,这是本机支持的,为此我发现这个样本工作得很好.我的想法是建立自己的语法,所以我开始尝试项目,看它是否会支持我需要的东西.因此,我创建了以下界面:
.H
#import <Foundation/Foundation.h>
@interface HYPLangNodeNP : NSObject
@end
Run Code Online (Sandbox Code Playgroud)
.M
#import "HYPLangNodeNP.h"
@implementation HYPLangNodeNP
@end
Run Code Online (Sandbox Code Playgroud)
是的,这只是一个空实现.然后我只对语法做了两处修改:
1)添加HYPLangNodeNP导入
%{
#import "MessageBlocks.h"
#import "HYPLangNodeNP.h"
int yylex(void);
void yyerror(char *s);
%}
Run Code Online (Sandbox Code Playgroud)
2)将HYPLangNodeNP添加到类型%union
%union {
float value;
NSString *identifier;
HYPLangNodeNP *node;
}
Run Code Online (Sandbox Code Playgroud)
该项目无法编译Unknown type name 'HYPLangNodeNP'.有谁知道如何解决?
编辑:
我不知道YACC版本,但它是Xcode 6.3附带的任何版本.以下是我得到的日志:
CompileC/Users/RafaelSoares/Library/Developer/Xcode/DerivedData/Parser_Test-ahryrrrgjyqtbhenhxphagqdgppf/Build/Intermediates/Parser\Test.build/Debug-iphonesimulator/Parser\Test.build/Objects-normal/i386/ViewController.o Parser\Test /ViewController.m正常i386 objective -c com.apple.compilers.llvm.clang.1_0.compiler cd"/ Users/RafaelSoares/Google Drive/Hype/ParserTest-master"export LANG = en_US.US-ASCII export PATH =" /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin :/ sbin"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective -c -arch i386 -fmessage-length = 0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit = 0 -std …
使用lex/yacc编写C++编译器需要多长时间?
我在哪里可以开始使用它?