तो मैं सीख रहा हूं कि जावासीसी में एक पार्सर कैसे बनाया जाए। यह उस प्रकार की भाषा होगी जिसकी हमें विश्लेषण करने की अपेक्षा की जाएगी।

bus(59) ->
    "Beach Shuttle"
    at 9:30 10:30 11:30 12:00
       13:00 14:00 15:00
    via stops 3 76 44 89 161 32
    free

bus(1234) ->
    "The Hills Loop"
    at 7:15 7:30 7:45 8:05 8:20 8:40 9:00
    via stops 99 97 77 66 145 168

bus(7) -> "City Transit"
at
    16:08 16:39 16:55 17:01 17:12 17:28
via
stops
    2 1 5 7 13 119
  1. हमारे पास कुछ नियम हैं जिनका पार्सर को भी पालन करने की आवश्यकता है।
  2. हमें "" के अंदर के लोगों को छोड़कर व्हाइटस्पेस को अनदेखा करना चाहिए।
  3. हमारे पास कितनी भी बस घोषणाएं हो सकती हैं और भीतर का क्रम हमेशा समान रहेगा।
  4. बस के नाम (दोहरे उद्धरणों में) में कितने भी वर्ण होंगे।
  5. समय 24hopur प्रारूप hh::mm में हैं और प्रति बस घोषणा एक होना चाहिए।
  6. स्टॉप नंबर सभी पूर्व-निर्धारित स्थान हैं और प्रति बस घोषणा कम से कम 2 होनी चाहिए।
  7. प्रत्येक बस घोषणा के लिए मुफ्त शब्द मौजूद हो भी सकता है और नहीं भी।

नीचे मेरा अब तक का कार्यान्वयन है, बीमार कोशिश करें और मेरी विचार प्रक्रिया को समझाएं।

PARSER_BEGIN(MyParser)
import java.io.*;
public class MyParser
{
    public static void parse(String fileName) throws IOException, ParseException
    {
        MyParser parser = new MyParser(new FileInputStream(fileName));
        parser.dsl();
    }
}

PARSER_END(MyParser);

//Remainder of the .jj file.
//Tokens to ignore in the BNF follow.

SKIP : { ' ' | '\t' | '\n' | '\r' }

TOKEN : {
    < BUSNUMBER : "bus(["0"-"9"]) |
    < BUSNAME : "(["a"-"z", "A"-"Z"])*  //Match a single character which can be lowercase or upper. Happens 0 or more times.
    < VIA : "via" > |
    < STOPS : "stops" > |
    < FREE : "free" > 
    
    }

// एक अस्थायी टिप्पणी संकेतक के रूप में इस्तेमाल किया गया था।

इसलिए मैंने अपने पात्रों को छोड़ने के लिए बनाया है। और वे सभी टोकन जिनके बारे में मैं सोच सकता हूं।

लेकिन मुझे यकीन नहीं है कि मैं क्या खो रहा हूँ। किसी भी मदद की सराहना की जाएगी, या एक स्पष्टीकरण बेहतर होगा क्योंकि मैं वास्तव में सीखना चाहता हूं कि यह कैसे करना है।

धन्यवाद।

2
Nitrogen 14 नवम्बर 2020, 18:23

1 उत्तर

सबसे बढ़िया उत्तर

कुछ टिप्पणियाँ। के लिये

    < BUSNUMBER : "bus(["0"-"9"]) |

आप शायद मतलब

    < BUSNUMBER : "bus(" (["0"-"9"])+ ")" > |

हालांकि, यदि आप रिक्त स्थान की अनुमति देना चाहते हैं, तो आपको bus, (, ), और संख्याओं को अलग टोकन के रूप में मानना ​​चाहिए।

के लिये

    < BUSNAME : "(["a"-"z", "A"-"Z"])*  //Match a single character which can be lowercase or upper. Happens 0 or more times.

आपको इसकी इच्छा हो सकती है

   < BUSNAME : "\"" (["a"-"z", "A"-"Z", " "])* "\""> | 

(मुझे नहीं पता कि बस के नाम में कौन से वर्ण संभव हैं, लेकिन आपके उदाहरण में आपके पास रिक्त स्थान के साथ-साथ अक्षर भी हैं।)

आप -> गायब हैं, संख्याएं और समय रोकें।

2
Theodore Norvell 18 नवम्बर 2020, 07:09