引用:
首先调用jacobgen产生输出文件,例子代码,这里只是简单的输出了一下(需要保存的是start以后的内容):
byte buf[];
TypeLibInspector dll = new TypeLibInspector();
buf = dll.queryInterface(argv[0]);
System.out.println("------------------ start ------------------");
for (int i = 0; i < buf.length; i++) {
System.out.print((char) buf[i]);
}
javacc对应的文件
jacobgen.jjt
options
{
JDK_VERSION = "1.5";
JAVA_UNICODE_ESCAPE = true;
NODE_PREFIX = "Jacob";
MULTI = true;
NODE_DEFAULT_VOID = true;
STATIC = false;
NODE_PACKAGE = "com.chenwenxuan.eclipse.jacob";
KEEP_LINE_COLUMN = true;
TRACK_TOKENS = true;
}
PARSER_BEGIN(JacobGenParser)
package com.chenwenxuan.eclipse.jacob;
public class JacobGenParser
{
public static void main(String args [])
{}
}
PARSER_END(JacobGenParser)
SKIP :
{
" "
}
TOKEN :
{
< TYPELIB : "TYPELIB" >
| < CLASS : "CLASS" >
| < GUID : "GUID" >
| < EXTENDS : "EXTENDS" >
}
TOKEN :
{
< TKIND_DISPATCH : "TKIND_DISPATCH" >
| < TKIND_COCLASS : "TKIND_COCLASS" >
| < TKIND_INTERFACE : "TKIND_INTERFACE" >
| < TKIND_ALIAS : "TKIND_ALIAS" >
| < TKIND_ENUM : "TKIND_ENUM" >
| < TKIND_MODULE: "TKIND_MODULE" >
}
TOKEN :
{
< INVOKE_FUNC : "INVOKE_FUNC" >
| < INVOKE_PROPERTYGET: "INVOKE_PROPERTYGET" >
| < INVOKE_PROPERTYPUT: "INVOKE_PROPERTYPUT" >
| < VAR_DISPATCH : "VAR_DISPATCH" >
| < VAR_CONST : "VAR_CONST" >
| < INVOKE_PROPERTYPUTREF: "INVOKE_PROPERTYPUTREF" >
}
TOKEN :
{
< EOL :
"/n"
| "/r"
| "/r/n" >
}
/*TOKEN:
{
<#IN_: "in-" >
| <#OUT_: "out-" >
| <#OPT_:"optional-" >
| <#RETVAL_: "retval-" >
| < IN_OUT: < IN_ > <OUT_ > >
| < IN_OUT_OPT: < IN_ > < OUT_ > < OPT_ >>
| < IN_OUT_OPT_RETVAL: < IN_ > < OUT_ > < OPT_ > < RETVAL_> >
| < IN: < IN_ > >
| < IN_OPT: < IN_ > < OPT_ >>
| < IN_OPT_RETVAL: < IN_ > < OPT_ > < RETVAL_ >>
| < OUT: < OUT_ > >
| < OUT_OPT: < OUT_ > < OPT_ > >
| < OUT_OPT_RETVAL: < OUT_ > < OPT_ > < RETVAL_ >>
}*/
/* IDENTIFIERS */
TOKEN :
{
< JACOBCONTENT : (<LETTER>|<DIGIT>|"-")+ >
|
< #IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
|
< #LETTER:
[
"/u0024",
"/u0041"-"/u005a",
"/u005f",
"/u0061"-"/u007a",
"/u00c0"-"/u00d6",
"/u00d8"-"/u00f6",
"/u00f8"-"/u00ff",
"/u0100"-"/u1fff",
"/u3040"-"/u318f",
"/u3300"-"/u337f",
"/u3400"-"/u3d2d",
"/u4e00"-"/u9fff",
"/uf900"-"/ufaff"
]
>
|
< #DIGIT:
[
"/u0030"-"/u0039",
"/u0660"-"/u0669",
"/u06f0"-"/u06f9",
"/u0966"-"/u096f",
"/u09e6"-"/u09ef",
"/u0a66"-"/u0a6f",
"/u0ae6"-"/u0aef",
"/u0b66"-"/u0b6f",
"/u0be7"-"/u0bef",
"/u0c66"-"/u0c6f",
"/u0ce6"-"/u0cef",
"/u0d66"-"/u0d6f",
"/u0e50"-"/u0e59",
"/u0ed0"-"/u0ed9",
"/u1040"-"/u1049"
]
>
}
SimpleNode start() #Root :
{}
{
typelib() < EOL >
(
oleclass()
)*
< EOF >
{
return jjtThis;
}
}
void oleclass() #OleClass :
{}
{
className() ";" classType() < EOL > guid() < EOL >
(
extendsclzes()
)?
(
invokefunc() < EOL >
| vardispatch() < EOL >
| constVar() < EOL >
| invokefuncget() < EOL >
| invokefuncput() < EOL >
| invokefuncputref() < EOL >
)*
}
void typelib() #TypeLib :
{
Token t;
}
{
< TYPELIB > t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void className() #ClassName :
{
Token t;
}
{
< CLASS > t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void classType() #ClassType :
{
Token t;
}
{
(
t = < TKIND_DISPATCH >
| t = < TKIND_COCLASS >
| t = < TKIND_INTERFACE >
| t = < TKIND_ALIAS >
| t = < TKIND_ENUM >
| t = < TKIND_MODULE >
)
{
jjtThis.value = t.image;
}
}
void guid() #Guid :
{
}
{
< GUID > ";" "{" guidValues() "}"
}
void guidValues() #GuidValue :
{Token t;}
{
t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void extendsclzes() #SuperClasses :
{
}
{
(
extendsclz() < EOL >
)+
}
void extendsclz() #SuperClass :
{
Token t;
}
{
< EXTENDS > ";" t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void constVar() #ConstVar :
{
Token t;
}
{
< VAR_CONST > ";" constName() ";" t = < JACOBCONTENT > ";"
try
{
(
constValue()
)*
}
catch(ParseException e)
{
System.out.println(e);
} catch(TokenMgrError e)
{
System.out.println(e);
}
{
jjtThis.value = t.image;
}
}
void constName() #ConstName :
{
Token t;
}
{
t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void constValue() #ConstValue :
{
Token t;
}
{
t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void invokefunc() #Function :
{
Token t;
}
{
< INVOKE_FUNC > ";" t = < JACOBCONTENT > ";" funcName() ";" "["
(
param()
)*
"]"
{
jjtThis.value = t.image;
}
}
void invokefuncget() #FunctionGet :
{
Token t;
}
{
< INVOKE_PROPERTYGET > ";" t = < JACOBCONTENT > ";" funcName() ";" "["
(
param()
)*
"]"
{
jjtThis.value = t.image;
}
}
void invokefuncput() #FunctionGet :
{
Token t;
}
{
< INVOKE_PROPERTYPUT > ";" t = < JACOBCONTENT > ";" funcName() ";" "["
(
param()
)*
"]"
{
jjtThis.value = t.image;
}
}
void invokefuncputref() #FunctionPutRef:
{
Token t;
}
{
< INVOKE_PROPERTYPUTREF > ";" t = < JACOBCONTENT > ";" funcName() ";" "["
(
param()
)*
"]"
{
jjtThis.value = t.image;
}
}
void funcName() #FunctionName :
{
Token t;
}
{
t = < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}
void param() #FunctionParam :
{
Token t;
}
{
(
//paraTypeInOutOpt()| paraTypeInOut() | paraTypeInOpt() | paraTypeIn() | paraTypeOutOpt()| paraTypeOut()
paraOption()
)? paraType() t = < JACOBCONTENT > ","
{
jjtThis.value = t.image;
}
}
void paraOption() #FunctionParaOption:
{
Token t;
}
{
"{" t =< JACOBCONTENT > "}"
{
jjtThis.value = t.image;
}
}
void paraType() #FunctionParaType:
{
Token t;
}
{
(
t = < JACOBCONTENT > | t = < GUID >
)
{
jjtThis.value = t.image;
}
}
void vardispatch() #Variable :
{
Token t;
}
{
< VAR_DISPATCH > ";" t = < JACOBCONTENT > ";" < JACOBCONTENT >
{
jjtThis.value = t.image;
}
}