1

Java をターゲットとする ANTLR 3.x を使用してパーサーを作成しています。私は、パーサー文法 (抽象構文ツリー (AST) を作成するため) とツリー文法 (AST で操作を実行するため) の両方を作成しました。最後に、両方の文法ファイルをテストするために、Java でテスト ファイルを作成しました。

以下のコードを見てください。

プロトコル文法

grammar protocol;
options {
      language = Java;
  output = AST;
}

tokens{ //imaginary tokens
PROT;
INITIALP;
PROC;
TRANSITIONS;
}
@header {
import twoprocess.Configuration;
package com.javadude.antlr3.x.tutorial;
}

@lexer::header {
  package com.javadude.antlr3.x.tutorial;
}
/*
parser rules, in lowercase letters
*/
program
    : declaration+
    ;
declaration
    :protocol
    |initialprocess
    |process
    |transitions
    ;

protocol
    :'protocol' ID ';' -> ^(PROT ID)
    ;
initialprocess
    :'pin' '=' INT ';' -> ^(INITIALP INT)
    ;
process
    :'p' '=' INT ';' -> ^(PROC INT)
    ;
transitions
    :'transitions' '=' INT ('(' INT ',' INT ')') + ';' -> ^(TRANSITIONS INT INT INT*)
    ;

/*
lexer rules (tokens), in upper case letters
*/
ID  
    : (('a'..'z' | 'A'..'Z'|'_')('a'..'z' | 'A'..'Z'|'0'..'9'|'_'))*;
INT 
    : ('0'..'9')+;
WHITESPACE
    : ('\t' | ' ' | '\r' | '\n' | '\u000C')+ {$channel = HIDDEN;};

プロトコルウォーカー

grammar protocolWalker;

options {
  language = Java;
  //Error, eclipse can't access tokenVocab named protocol
  tokenVocab = protocol;    //import tokens from protocol.g i.e, from protocol.tokens file
  ASTLabelType = CommonTree;
  }

@header {
import twoprocess.Configuration;
package com.javadude.antlr3.x.tutorial;
}

program
    : declaration+
    ;

declaration
    :protocol
    |initialprocess
    |process
    |transitions
    ;

protocol
    :^(PROT ID)
    {System.out.println("create protocol " +$ID.text);}
    ;

initialprocess
    :^(INITIALP INT)
    {System.out.println("");}
    ;

process
    :^(PROC INT)
    {System.out.println("");}
    ;

transitions
    :^(TRANSITIONS INT INT INT*)
    {System.out.println("");}
    ;

プロトコルtest.java

package com.javadude.antlr3.x.tutorial;  
import org.antlr.runtime.*;  
import org.antlr.runtime.tree.*;  
import org.antlr.runtime.tree.CommonTree;  
import org.antlr.runtime.tree.CommonTreeNodeStream;  
public class Protocoltest { 



/**
 * @param args
 */
public static void main(String[] args) throws Exception {
    //create input stream from standard input
    ANTLRInputStream input = new ANTLRInputStream(System.in);
    //create a lexer attached to that input stream
    protocolLexer lexer = new protocolLexer(input);
    //create a stream of tokens pulled from the lexer
    CommonTokenStream tokens = new CommonTokenStream(lexer);

    //create a pareser attached to teh token stream
    protocolParser parser = new protocolParser(tokens);
    //invoke the program rule in get return value
    protocolParser.program_return r =parser.program();
    CommonTree t = (CommonTree)r.getTree();
    //output the extracted tree to the console
    System.out.println(t.toStringTree());

    //walk resulting tree; create treenode stream first
    CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
    //AST nodes have payloads that point into token stream
    nodes.setTokenStream(tokens);


    //create a tree walker attached to the nodes stream  
            //Error, can't create TreeGrammar object called walker
    protocolWalker walker = new protocolWalker(nodes);

    //invoke the start symbol, rule program
    walker.program();
    }
}

問題:

  1. protocolWalker で、トークン (protocol.tokens) にアクセスできません。

    //Error, eclipse can't access tokenVocab named protocol  
        tokenVocab = protocol; //import tokens from protocol.g i.e, from protocol.tokens file
    
  2. protocolWalkerで、アクションリストにConfigurationというJavaクラスのオブジェクトを作成することはできますか?

    protocol
        :^(PROT ID)
           {System.out.println("create protocol " +$ID.text);
            Configuration conf = new Configuration();
           }
        ;
    
  3. Protocoltest.java 内

    //create a tree walker attached to the nodes stream    
    //Error, can't create TreeGrammar object called walker  
        protocolWalker walker = new protocolWalker(nodes);  
    

    protocolWalker のオブジェクトを作成できません。そのようなオブジェクトが作成される例とチュートリアルで見ました。

4

2 に答える 2

1

protocolWalkerで、トークン(protocol.tokens)にアクセスできません...

正常にアクセスしているようです。他のものにprotocol.tokens変更tokenVocabすると、現在は生成されないエラーが生成されます。protocolWalker.gの問題は、トークンパーサー(grammar protocolWalker)として定義されているが、ツリーパーサーのように使用されていることです。文法を定義するtree grammar protocolWalkerことで、未定義のトークンについて私が見たエラーを取り除いた。

protocolWalkerで、アクションリストにConfigurationというJavaクラスのオブジェクトを作成できますか?

はい、できます。通常のJavaプログラミングの警告は、クラスのインポートなどに適用されますが、のようなコードと同じように利用できますSystem.out.println

Protocoltest.javaで...protocolWalkerのオブジェクトを作成できません。

protocolWalker.g(現在の状態)は、という名前のトークンパーサーを生成しますprotocolWalkerParser。ツリー文法に変更すると、protocolWalker代わりに名前が付けられたツリーパーサーが生成されます。

文法全体を投稿してくれてありがとう。これにより、質問への回答がはるかに簡単になりました。

于 2012-10-22T21:27:51.060 に答える