javacc解析jacobgen输出文件

引用:

http://blog.chenwenxuan.com/index.php/2011/03/31/javacc%E8%A7%A3%E6%9E%90jacobgen%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6/

 

 

首先调用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;

  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值