2016-05-09 12 views
6

रूप antlr 4 में गोली चलाई नहीं जा रहा है, मैंAntlr4, सी # में, त्रुटि हैंडलिंग की उम्मीद

एक व्याकरण जो प्रारूप x * वाई, x + y के तार लेता है, आदि है मैं एक त्रुटि जब पकड़ने के लिए चाहते हैं एक अवैध ऑपरेटर का उपयोग किया जाता है, जैसे x & y। अगर मैं जोड़ने के कोड की तरह:

parser.RemoveErrorListeners(); 
parser.AddErrorListener(new MyErrorListener()); 

और MyErrorListener परिभाषित के रूप में:

public class MyErrorListener : BaseErrorListener 
{ 
    public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e) 
    { 

...

सिंटैक्स त्रुटि एक्स & वाई मामले में नहीं बुलाया जाता है .... लेकिन होगा एक्स & मामले में बुलाया जा सकता है ...

मैं पूरी तरह उलझन में हूं, क्योंकि कंसोल श्रोता दोनों रूपों के लिए एक त्रुटि दिखाएगा, फिर भी मेरा कस्टम एक नहीं होगा। मैं वास्तव में ऐसा करने में सक्षम होना चाहता हूं, "अगर किसी भी प्रकार की पार्सिंग त्रुटि है, तो x करें" लेकिन मुझे यह पता लगाना प्रतीत नहीं होता है।

सहायता!

यहाँ btw व्याकरण का हिस्सा है:, दिलचस्प बात यह

equation : boolEquation (op=(AND|OR) boolEquation)* ; 
boolEquation : NOT? boolExpression ; 
boolExpression : 
    left=expression (op=relop right=expression)? #BoolExpressionMatch ; 
expression : 
     name=ID LPAREN expList=expressionList RPAREN #FunctionMatch 
     | left=expression op=(TIMES | DIV | MODULUS) right=expression # ExpressionMatch 
     | left=expression op=(PLUS | MINUS) right=expression     #ExpressionMatch 
     | LPAREN expression RPAREN           #ParenthesizedExpressionMatch 
     | atom                #AtomMatch ; 

atom : number      #NumberMatch 
    | string      #StringMatch 
    | variable     #AtomVariableMatch 
    | unaryValue     #UnaryValueMatch 
    | boolean      #BooleanMatch ; 
string : ID ; 
boolean : TRUE | FALSE; 
unaryValue : EMPTY | PRESENT ; 
func : name=ID LPAREN expList=expressionList RPAREN ; 
expressionList : (expression (COMMA expression)*)? ; 
variable : WORD(POINT WORD)*  #VariableMatch ; 

...

यहां तक ​​कि जब मैं सभी त्रुटि श्रोताओं को निकालते हैं, मैं अभी भी सांत्वना को यह उत्पादन देखें: लाइन 1 : 1 टोकन मान्यता त्रुटि: '?'

+0

यदि आप सभी त्रुटियों को सुनना चाहते हैं तो आपको पुनर्प्राप्ति तर्क की आवश्यकता हो सकती है। –

उत्तर

0
देखकर अपने व्याकरण मैं केवल अनुमान लगा सकते हैं कि क्या गलत है बिना

, लेकिन मैं आपको एक नियम है कि यह के भाग के रूप & स्वीकार करता है मान लेते हैं, इसलिए जब आप X&Y में फ़ीड यह एक टोकन और इसलिए वैध इनपुट के रूप में स्वीकार किया जाता है।

इस तरह के मामलों में डीबग करने का पहला चरण लेक्सर देखे जाने वाले सभी टोकन की एक सूची मुद्रित करना चाहिए। TokenStream.getTokens() देखें। यह आपको दिखाएगा कि टोकन को आपके व्याकरण को लिखने के दौरान उन्हें किस तरह से पहचाना जाता है।

+0

मैं उत्तर की सराहना करता हूं, लेकिन मैं अपने व्याकरण में कहीं भी एक्स और वाई स्वीकार नहीं करता हूं। मैंने भी एक ही समस्या के साथ एक्स? वाई में बदलने की कोशिश की। – shuri17

0

मैंने इसे समझ लिया। अनिवार्य रूप से, समस्या यह एक व्याख्यात्मक त्रुटि थी, सिंटैक्स त्रुटि नहीं। तो लेक्सिकल विश्लेषक के त्रुटि श्रोता की जगह चाल चल रही थी।

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