2012-02-08 18 views
9

मैं सी # के साथ जावास्क्रिप्ट (ECMASCript) पार्स करने की कोशिश कर रहा हूं।सी #, एएनटीएलआर, ईसीएमएस्क्रिप्ट व्याकरण परेशानी

मैं कैसे नई परियोजना बनाने के लिए पर निम्नलिखित अनुदेश पाया: http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075

तो मैं डाउनलोड किया है ANTLRWorks, ANTLR v3, ANTLR अनपैक किया, एक VS2010 परियोजना (.NET4) बनाया, संदर्भ कहा, जाँच की और उत्पन्न व्याकरण।

तब मैं संकलन त्रुटि का एक बहुत प्राप्त:

The type or namespace name 'AstParserRuleReturnScope' could not be found (are you missing a using directive or an assembly reference?)

The type or namespace name 'GrammarRule' could not be found (are you missing a using directive or an assembly reference?)

उनके लिए Stackoverlowed और एक समाधान मिल गया: antlr c# errors when integrating into VS2008

तो मैं डाउनलोड किया है नया क्रम, पुरानी को ओवरराइट और परियोजना कंपाइल और

The name 'HIDDEN' does not exist in the current context d:\Workspace.1\ScriptParser\ScriptParser\TestLexer.cs

ठीक है, मैं छिपे रूप में सिफारिश की बदल दिया है छिपे हुए के लिए निम्न बातचीत में: [antlr-interest] How viable is the Csharp3 target? (more specific questions)

अब मैं इनपुट को पार्स करने की कोशिश कर रहा हूं। मैं कुछ उदाहरण मिल गया है और निम्नलिखित कोड लिखा है: पार्सर ANTLR के साथ जावास्क्रिप्ट फाइल करने के लिए

using Antlr.Runtime; 
namespace ScriptParser 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var stream = new ANTLRStringStream("1+2"); 
      var lexer = new TestLexer(stream); 
      var tokenStream = new CommonTokenStream(lexer); 
      var parser = new TestParser(tokenStream); 
      // what exactly should be here??? 
     } 
    } 
} 

मेरा लक्ष्य है लेकिन ऐसा लगता है कि यह उतना आसान नहीं के रूप में मैंने सोचा था कि हो जाएगा ...

अद्यतन :

public expr : mexpr (PLUS^ mexpr)* SEMI! 
; 
:

रूप Why are antlr3 c# parser methods private? में सुझाव दिया मैं "सार्वजनिक" expr शासन से पहले संशोधित जोड़कर Test.g व्याकरण संशोधित कर लिया है

और उसके बाद कोड पुनर्जीवित, हिडन (फिर) के लिए छिपे प्रतिस्थापित और कोड को संशोधित इस प्रकार है:

var stream = new ANTLRStringStream("1+2"); 
var lexer = new TestLexer(stream); 
var tokenStream = new CommonTokenStream(lexer); 
var parser = new TestParser(tokenStream); 
var result = parser.expr(); 
var tree = (CommonTree)result.Tree; 

और यह निम्नलिखित उत्पन्न कोड

में लाइन

root_0 = (object)adaptor.Nil(); 

पर क्रैश हो रहा है नहीं

try { DebugEnterRule(GrammarFileName, "expr"); 
DebugLocation(7, 0); 
try 
{ 
    // d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:13: (mexpr (PLUS^mexpr)* SEMI !) 
    DebugEnterAlt(1); 
    // d:\\Workspace.1\\ScriptParser\\ScriptParser\\Test.g:7:15: mexpr (PLUS^mexpr)* SEMI ! 
    { 
    root_0 = (object)adaptor.Nil(); 

    DebugLocation(7, 15); 
    PushFollow(Follow._mexpr_in_expr31); 

NullReferenceException संदेश के साथ क्योंकि एडाप्टर शून्य है।

2 जोड़ने

parser.TreeAdaptor = new CommonTreeAdaptor(); 

अद्यतन द्वारा इसका समाधान नहीं किया है:

तो, अंत में मैं अपने प्राथमिक कार्य के साथ शुरू कर दिया है: जावास्क्रिप्ट पार्स।

ANTLR highlights क्रिस लैंब्रो द्वारा ईसीएमएस्क्रिप्ट व्याकरण।

तो मैं बना लेने के बाद lexer/पार्सर और बहुत ही सरल JavaScript कोड वाले इसे चलाने:

var f = function() { }; 

और पार्स tree.ToStringTree() से निम्न उत्पादन के साथ विफल रहता है:

<error: var q = function() { };> 
+0

चेकआउट यह पिछले क्यू एंड ए: http://stackoverflow.com/questions/4396080/antlr-3-3-c-sharp-tutorials –

+0

उत्कृष्ट ट्यूटोरियल के लिए धन्यवाद। जैसा कि मैं समझता हूं, व्याकरण में नियमों को विधियों में परिवर्तित किया जाना चाहिए। मैं http://www.antlr.org/wiki/pages/viewpage.action?pageId=557075 और एएनटीएलआरवर्क्स से व्याकरण का उपयोग "expr", "परमाणु" और अन्य विधियों को उत्पन्न करता हूं, लेकिन वे निजी हैं। –

+0

धन्यवाद एलेक्स। W.r.t. निजी तरीकों (पार्सर नियम), एक और प्रश्नोत्तर देखें: http://stackoverflow.com/questions/6411520/why-are-antlr3-c-sharp-parser-methods-private –

उत्तर

1

आपका व्याकरण नियम कहता है कि अभिव्यक्ति के अंत में अर्धविराम होना चाहिए, लेकिन आपके मुख्य कार्य में:

var stream = new ANTLRStringStream("1+2"); 

में अर्धविराम गुम है। यह "1 + 2" नहीं होना चाहिए?

+0

निश्चित रूप से "1 + 2;" मान्य जावास्क्रिप्ट है। लेकिन फिर "1 + 2" (या कम से कम "1 + 2 \ n") है। एएनटीएलआर व्याकरण गायब को कैसे संभालता है ";" सवाल? –

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