2017-11-12 2 views
0

私は新しいPHPの対象とANTLR4を拡張し、StringTemplateファイル(.STG)に問題があるしようとしています:ANTLR4 - ネストされたクラスのない目標

StringTemplateでパーサをファイルは、テンプレートParser_によって定義されます。 Parser_には次のルールが含まれています。

<funcs; separator="\n"> 

このルールはクラス定義と関数を生成します。このルールはパーサークラス内にありますが、PHPはネストされたクラスをサポートしていません。

クラス定義と関数をStringTemplateファイルで分割する可能性はありますか?私は、パーサクラスの前にfuncsテンプレートのクラス定義を設定し、パーサクラスの中のfuncsテンプレートの関数を設定したいと思います。

全体パーサ-テンプレート:

Parser_(parser, funcs, atn, sempredFuncs, ctor, superClass) ::= <<  

// funcs beinhaltet die Klasse und dann die Funktion 

class <parser.name> extends <if(superClass)><superClass><else>\antlr4\php7_runtime\Parser<endif> { 

    public $grammarFileName = "<parser.grammarFileName>"; 
    public $atn = null; 
    public $decisionsToDFA = array(); 
    public $sharedContextCache = null; 


    public $literalNames = [ <parser.literalNames:{t | <t>}; null="'\<INVALID>'", separator=", ", wrap, anchor> ]; 

    public $symbolicNames = [ <parser.symbolicNames:{t | <t>}; null="'\<INVALID>'", separator=", ", wrap, anchor> ]; 

    <parser.rules:{r | const RULE_<r.name> = <r.index>;}; separator="\n", wrap, anchor> 

    public $ruleNames = [ <parser.ruleNames:{r | "<r>"}; separator=", ", wrap, anchor> ]; 

    public $EOF = <PathRuntime()><TokenLabelType()>::EOF; 

    <if(parser.tokens)> 
    <parser.tokens:{k | const <k>=<parser.tokens.(k)>;}; separator="\n", wrap, anchor> 
    <endif>  

    <atn>  

    <parser:(ctor)()> 

    <namedActions.members> 

// funcs -- Start 
    <funcs; separator="\n"> 
// funcs -- Ende   

} // class <parser.name>  



<if(sempredFuncs)> 
    function sempred($localctx, int $ruleIndex, int $predIndex){ 
     if ($this->_predicates == null) { 
      $this->_predicates = py_dict(); 
     } 
<parser.sempredFuncs.values:{ f | 
     $this->predicates[<f.ruleIndex>] = $this-><f.name>_sempred}; separator="\n"> 
     $pred = $this->_predicates->get($ruleIndex, null); 
     if ($pred == null) { 
      throw Exception("No predicate with index:" . (string) $ruleIndex); 
     } else { 
      return pred($localctx, $predIndex) 
     } 


    <sempredFuncs.values; separator="\n"> 
    } 
<endif> 

>> 

はお時間をいただき、ありがとうございます!

答えて

0

ソリューションはparser.funcs.ruleCtxを歩くことと

Parser_(parser, funcs, atn, sempredFuncs, ctor, superClass) ::= << 

<funcs :{ func | <func.ruleCtx> }; separator="\n"> // here the Comtext classes 

class <parser.name> extends <if(superClass)><superClass><else>\antlr4\php7_runtime\Parser<endif> { 

    public $grammarFileName = "<parser.grammarFileName>"; 
    public $atn = null; 
    public $decisionsToDFA = array(); 
    public $sharedContextCache = null; 


    public $literalNames = [ <parser.literalNames:{t | <t>}; null="'\<INVALID>'", separator=", ", wrap, anchor> ]; 

    public $symbolicNames = [ <parser.symbolicNames:{t | <t>}; null="'\<INVALID>'", separator=", ", wrap, anchor> ]; 

    <parser.rules:{r | const RULE_<r.name> = <r.index>;}; separator="\n", wrap, anchor> 

    public $ruleNames = [ <parser.ruleNames:{r | "<r>"}; separator=", ", wrap, anchor> ]; 

    public $EOF = <PathRuntime()><TokenLabelType()>::EOF; 

    <if(parser.tokens)> 
    <parser.tokens:{k | const <k>=<parser.tokens.(k)>;}; separator="\n", wrap, anchor> 
    <endif>  


<atn>  


    <parser:(ctor)()> 

    <funcs; separator="\n"> // here RuleFunction is emitted 


} // class <parser.name>  


<namedActions.members> 

<if(sempredFuncs)> 
    function sempred($localctx, int $ruleIndex, int $predIndex){ 
     if ($this->_predicates == null) { 
      $this->_predicates = py_dict(); 
     } 
<parser.sempredFuncs.values:{ f | 
     $this->predicates[<f.ruleIndex>] = $this-><f.name>_sempred}; separator="\n"> 
     $pred = $this->_predicates->get($ruleIndex, null); 
     if ($pred == null) { 
      throw Exception("No predicate with index:" . (string) $ruleIndex); 
     } else { 
      return pred($localctx, $predIndex) 
     } 


    <sempredFuncs.values; separator="\n"> 
    } 
<endif> 
>> 
:-) RuleFunctionテンプレートから除外するようにしました
関連する問題