2014-03-24 40 views
1

我想創建我的第一個ANTLR3樹語法,但我一直打同樣的問題。分析器的輸出是:ANTLR3樹語法:循環沒有匹配任何東西在輸入'EOF'

$ echo 'foo, bar' | ./run.sh 
foo bar 
TreeGrammar.g: node from line 0:0 required (...)+ loop did not match anything at input 'EOF' 
Exception in thread "main" java.lang.NullPointerException 
    at Driver.main(Driver.java:29) 

輸出清楚地表明,階段-1解析器結果在右標記(「富」和「酒吧」)。不知何故,stage-2樹解析器拒絕解析stage-1的結果。由於代碼是非常基本的,那一定是我的一部分;-)

這裏是我的簡單測試代碼一些簡單的,愚蠢的監督:

Grammar.g:

grammar Grammar; 

options { 
    output = AST; 
} 

statement: word (','! word)* EOF!; 

word: ID; 

ID: ('a'..'z'|'A'..'Z')+; 

WS: (' ' | '\t' | '\n' | '\r')+ { $channel = HIDDEN; } ; 

TreeGrammar.g:

tree grammar TreeGrammar; 

options { 
    tokenVocab = Grammar; 
    ASTLabelType = CommonTree; 
    output = template; 
} 

statement: word+; 

word: ID; 

Driver.java:

import java.io.*; 
import org.antlr.runtime.*; 
import org.antlr.runtime.tree.*; 
import org.antlr.stringtemplate.*; 

public class Driver { 
    public static void main(String[] args) throws Exception { 
     FileReader groupFileR = new FileReader("Template.stg"); 
     StringTemplateGroup templates = new StringTemplateGroup(groupFileR); 
     groupFileR.close(); 

     ANTLRInputStream input = new ANTLRInputStream(System.in); 
     GrammarLexer lexer = new GrammarLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     GrammarParser parser = new GrammarParser(tokens); 
     GrammarParser.statement_return result = parser.statement(); 
     CommonTree t = (CommonTree)result.getTree(); 

     System.out.println(t.toStringTree()); 

     CommonTreeNodeStream nodes = new CommonTreeNodeStream(t); 
     nodes.setTokenStream(tokens); 
     TreeGrammar walker = new TreeGrammar(nodes); 
     walker.setTemplateLib(templates); 
     walker.statement(); 
     TreeGrammar.statement_return r2 = walker.statement(); 
     StringTemplate output = (StringTemplate) r2.getTemplate(); 

     System.out.println(output.toString()); 
    } 
} 

回答

1

假設你StringTemplate的羣體適當地形成,你的問題是最有可能的FATC你步行您的AST兩次:

walker.statement(); 
    TreeGrammar.statement_return r2 = walker.statement(); 

例如,你叫walker.statement()兩次。這就是(第一)錯誤是告訴你:

TreeGrammar.g: node from line 0:0 required (...)+ loop did not match anything at input 'EOF'

您與walker.statement()消耗輸入一次產生的節點流是在結束(EOF),然後你再打電話walker.statement()它預計再次步行word+,但只有EOF左側。

相關問題