2010-12-09 22 views
9

मैं एक व्याकरण नियम मिल गया है,एएनटीएलआर: टोकन नाम प्राप्त करें?

OR 
    : '|'; 

लेकिन जब मैं एएसटी उपयोग करते हुए,

public static void Preorder(ITree tree, int depth) 
{ 
    if (tree == null) 
    { 
     return; 
    } 

    for (int i = 0; i < depth; i++) 
    { 
     Console.Write(" "); 
    } 

    Console.WriteLine(tree); 

    for(int i=0; i<tree.ChildCount; ++i) 
     Preorder(tree.GetChild(i), depth + 1); 
} 

(धन्यवाद Bart) प्रिंट यह वास्तविक | चरित्र प्रदर्शित करता है। क्या कोई तरीका है कि मैं इसे "या" कहने के लिए कह सकता हूं?

उत्तर

8

robert इस उत्तर को प्रेरित किया।

if (ExpressionParser.tokenNames[tree.Type] == tree.Text) 
    Console.WriteLine(tree.Text); 
else 
    Console.WriteLine("{0} '{1}'", ExpressionParser.tokenNames[tree.Type], tree.Text); 
6

मुझे इसे कुछ हफ्ते पहले करना था, लेकिन पायथन एएनटीएलआर के साथ। यह आपकी बहुत मदद नहीं करता है, लेकिन यह किसी और को उत्तर खोजने में मदद कर सकता है।

पायथन एएनटीएलआर के साथ, टोकन प्रकार पूर्णांक हैं। टोकन टेक्स्ट टोकन ऑब्जेक्ट में शामिल किया गया है। यहाँ समाधान मैं प्रयोग किया जाता है:

import antlrGeneratedLexer 

token_names = {} 
for name, value in antlrGeneratedLexer.__dict__.iteritems(): 
    if isinstance(value, int) and name == name.upper(): 
     token_names[value] = name 

टोकन के नंबर के लिए कोई स्पष्ट तर्क (कम से कम, पायथन ANTLR के साथ) नहीं है, और टोकन के नाम मॉड्यूल __dict__ में छोड़कर तार के रूप में जमा नहीं कर रहे हैं, तो यह है उन्हें पाने का एकमात्र तरीका।

मुझे लगता है कि सी # टोकन प्रकारों में एक गणना है, और मेरा मानना ​​है कि गणनाओं को स्ट्रिंग के रूप में मुद्रित किया जा सकता है। लेकिन यह सिर्फ एक अनुमान है।

+0

बिंगो!'Console.WriteLine (ExpressionParser.tokenNames [tree.Type]);' 'int '' वृक्ष' टाइप 'में संग्रहीत है और "dict" को' ___ Parser.tokenNames' में संग्रहीत किया जाता है। – mpen

0

मैं ANTLR के लिए नया हूँ, लेकिन ऐसा लगता है ITree कोई सीधा दायित्व Parser (.NET में) से संबंधित हो गया है। इसके बजाय वहाँ एक व्युत्पन्न इंटरफ़ेस IParseTree, Parser से (Antlr4 में) लौट आए है, और यह ओवरराइड सहित कुछ अतिरिक्त तरीकों में शामिल हैं:

string ToStringTree(Parser parser); 

यह पाठ प्रतिनिधित्व में पूरी नोड सबट्री बदल देता है। कुछ मामलों के लिए यह उपयोगी है।

public static string GetNodeText(ITree t, Parser recog); 

इस विधि मूलतः एक ही के रूप में मार्क और रॉबर्ट सुझाव दिया है, लेकिन अधिक में: क्या आप कुछ ठोस नोड का सिर्फ नाम देखने के लिए पसंद है, तो बिना यह बच्चों है, तो वर्ग Trees में स्थिर विधि का उपयोग सामान्य और लचीला तरीका।

1

लड़का, मैंने इस दीवार को समझने की कोशिश कर दीवार के खिलाफ अपने सिर को टक्कर लगी है। मार्क का जवाब मुझे संकेत मैं जरूरत दिया, और जैसे निम्नलिखित टोकन नाम एक TerminalNode से antlr 4.5 में मिल जाएगा यह लग रहा है: या सी # में

myLexer.getVocabulary.getSymbolicName(myTerminalNode.getSymbol.getType) 

,:

myLexer.Vocabulary.GetSymbolicName(myTerminalNode.Symbol.Type) 

(आप की तरह लग रहा वास्तव में पार्सर या लेक्सर से शब्दावली प्राप्त कर सकते हैं।)

एंटीलर 4.5 में टोकन में उन शब्दावली विधियों को पसंदीदा तरीका माना जाता है, और टोकन नामों को बहिष्कृत किया जाता है।

ऐसा लगता है कि मुझे लगता है कि एक सुंदर बुनियादी ऑपरेशन है, तो शायद यह एक आसान तरीका है।

संबंधित मुद्दे