JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ باقاعده اظهار، حصو 5

جاوا ۾ باقاعده اظهار، حصو 5

گروپ ۾ شايع ٿيل
اسان توهان جي توجه لاءِ پيش ڪريون ٿا هڪ مختصر گائيڊ جو ترجمو جاوا ۾ باقاعده اظهار لاءِ، جيف فريسن طرفان لکيل آهي javaworld ويب سائيٽ لاءِ. پڙهڻ جي آسانيءَ لاءِ، اسان مضمون کي ڪيترن ئي حصن ۾ ورهايو آهي. هي حصو آخري آهي. جاوا ۾ باقاعده اظهار، حصو 5 - 1جاوا ۾ باقاعده اظهار، حصو 1 جاوا ۾ باقاعده اظهار، حصو 2 جاوا ۾ باقاعده اظهار، حصو 3 جاوا ۾ باقاعده اظهار، حصو 4

لغتي تجزيي لاءِ باقاعده اظهار جو استعمال

ريگيولر ايڪسپريسشن جو هڪ اڃا به وڌيڪ ڪارائتو ايپليڪيشن ليڪسيڪل تجزيي کي انجام ڏيڻ لاءِ ٻيهر استعمال جي قابل ڪوڊ جي لائبريري آهي، ڪنهن به مرتب ڪندڙ يا جمع ڪندڙ جو هڪ اهم حصو. انهي صورت ۾، اکرن جي ان پٽ اسٽريم کي ٽوڪن جي هڪ آئوٽ اسٽريم ۾ گروپ ڪيو ويو آهي - ڪردارن جي ترتيبن جا نالا جيڪي هڪ عام معني رکن ٿا. مثال طور، ان پٽ اسٽريم ۾ اکرن جي تسلسل کي سامهون اچڻ تي c، o, u, n, t, e, , r, lexical analyzer هڪ ٽوڪن ID(Identifier) ​​ڪڍي سگهي ٿو. ٽوڪن سان ملندڙ اکرن جي تسلسل کي ليڪسيم چئبو آهي.
مارڪر ۽ ليڪسيمز بابت وڌيڪ
ٽوڪن جهڙوڪ ID ڪيترن ئي ڪردارن جي ترتيب سان ملن ٿيون. اھڙن ٽوڪن جي صورت ۾، ٽوڪن سان لاڳاپيل اصل ٽوڪن پڻ گڏ ڪرڻ واري، گڏ ڪندڙ، يا ٻي افاديت جي ضرورت آھي جنھن لاءِ لڪل تجزيي جي ضرورت آھي. ٽوڪن لاءِ جيڪي اکرن جي ھڪڙي مخصوص ترتيب کي ظاھر ڪن ٿا، جھڙوڪ ٽوڪن PLUSصرف ڪردار سان ملندڙ جلندڙ آھي +، حقيقي ٽوڪن جي ضرورت نه آھي ڇو ته ان کي ٽوڪن مان سڃاڻي سگھجي ٿو.
ريگيولر ايڪسپريسز رياست جي بنياد تي ليڪسيڪل تجزيه نگارن جي ڀيٽ ۾ تمام گهڻو ڪارائتو آهن، جن کي هٿ سان لکيو وڃي ٿو ۽ عام طور تي ٻيهر استعمال نٿو ڪري سگهجي. هڪ باقاعده اظهار جي بنياد تي ليڪسيڪل تجزيه نگار جو هڪ مثال JLex آهي ، جاوا ٻولي لاءِ هڪ ليڪسيڪل جنريٽر جيڪو باقاعده اظهار استعمال ڪندو آهي قاعدن جي وضاحت ڪرڻ لاءِ ان پٽ ڊيٽا اسٽريم کي ٽوڪن ۾ ٽوڙڻ لاءِ. ٻيو مثال Lexan آهي.

Lexan کي ڄاڻڻ

Lexan هڪ ٻيهر استعمال لائق جاوا لائبريري آهي ليڪسيڪل تجزيي لاءِ. اهو بلاگ پوسٽ سيريز جي ڪوڊ تي ٻڌل آهي جاوا ۾ هڪ پارسر لکڻ Cogito Learning ويب سائيٽ تي . لائبريري ھيٺين طبقن تي مشتمل آھي، جيڪي ca.javajeff.lexanھن آرٽيڪل لاءِ ڊائون لوڊ ڪرڻ واري ڪوڊ ۾ شامل پيڪيج ۾ آھن:
  • Lexan: لغوي تجزيه نگار؛
  • LexanException: استثنا ڪلاس تعمير ڪندڙ ۾ اڇلايو ويوLexan;
  • LexException: استثنا اڇلايو ويو آهي جيڪڏهن غلط نحو لغوي تجزيي دوران معلوم ٿئي ٿي؛
  • Token: نالو باقاعده اظهار جي خاصيت سان؛
  • TokLex: ٽوڪن/ ٽوڪن جو جوڙو.
ٺاھيندڙ Lexan(java.lang.Class tokensClass)ھڪڙو نئون ليڪسيڪل تجزيي ٺاھي ٿو. ان کي هڪ دليل جي ضرورت آهي هڪ طبقاتي اعتراض جي صورت ۾ java.lang.Classجيڪو قسم جي مسلسل طبقي سان لاڳاپيل آهي static Token. Reflection API استعمال ڪندي، Constructor سڀني مستقلن کي Tokenقدرن جي صف ۾ پڙھي ٿو Token[]. جيڪڏهن Tokenڪو به مستقل نه آهي، هڪ استثنا اڇلايو ويندو آهي LexanException. جاوا ۾ باقاعده اظهار، حصو 5 - 2ڪلاس Lexanپڻ هيٺين ٻن طريقن کي مهيا ڪري ٿو:
  • اهو طريقو هن ليڪسر جي هڪ فهرست ڏي ٿو ؛List getTokLexes() Token
  • Метод void lex(String str)ان پٽ اسٽرنگ جو لڪسيڪل تجزيو انجام ڏئي ٿو [نتيجو رکيل سان] قسم جي قدرن جي فهرست ۾ TokLex. جيڪڏهن ڪو ڪردار سامهون اچي ٿو جيڪو ڪنهن به صف جي نمونن سان نه ٿو ملي Token[]، هڪ استثنا اڇلايو ويندو آهي LexException.
ڪلاس LexanException۾ ڪو به طريقو نه آهي؛ اهو استعمال ڪري ٿو وراثت وارو طريقو هڪ استثنا پيغام موٽڻ لاءِ getMessage(). ان جي ابتڙ، ڪلاس LexExceptionهيٺ ڏنل طريقا مهيا ڪري ٿو:
  • طريقو int getBadCharIndex()هڪ ڪردار جي پوزيشن کي واپس ڏئي ٿو جيڪو ڪنهن به مارڪر جي نمونن سان نه ملندو آهي.
  • طريقو اهو String getText()متن واپس ڏئي ٿو جيڪو تجزيو ڪيو ويو جڏهن استثنا پيدا ڪيو ويو.
ڪلاس مارڪر جو نالو واپس ڪرڻ جو Tokenطريقو ختم ڪري ٿو . toString()اهو پڻ هڪ طريقو مهيا ڪري ٿو String getPattern()جيڪو ٽوڪن جي باقاعده اظهار جي خاصيت کي واپس ڏئي ٿو. ڪلاس TokLexھڪڙو طريقو مهيا ڪري ٿو Token getToken()جيڪو پنھنجي ٽوڪن کي واپس ڪري ٿو. اهو پڻ هڪ طريقو مهيا ڪري ٿو String getLexeme()جيڪو پنهنجي ٽوڪن کي واپس ڪري ٿو.

ليڪسان لائبريري جو مظاهرو

اهو ڏيکارڻ لاءِ ته لائبريري ڪيئن ڪم ڪري ٿي، Lexanمون هڪ درخواست لکي LexanDemo. اهو طبقن تي مشتمل آهي LexanDemo, BinTokens۽ MathTokens. NoTokensايپليڪيشن جو سورس ڪوڊ LexanDemoلسٽنگ 2 ۾ ڏيکاريو ويو آهي. لسٽنگ 2. عمل ۾ ليڪسان لائبريري جو مظاهرو
import ca.javajeff.lexan.Lexan;
import ca.javajeff.lexan.LexanException;
import ca.javajeff.lexan.LexException;
import ca.javajeff.lexan.TokLex;

public final class LexanDemo
{
   public static void main(String[] args)
   {
      lex(MathTokens.class, " sin(x) * (1 + var_12) ");
      lex(BinTokens.class, " 1 0 1 0 1");
      lex(BinTokens.class, "110");
      lex(BinTokens.class, "1 20");
      lex(NoTokens.class, "");
   }

   private static void lex(Class tokensClass, String text)
   {
      try
      {
         Lexan lexan = new Lexan(tokensClass);
         lexan.lex(text);
         for (TokLex tokLex: lexan.getTokLexes())
            System.out.printf("%s: %s%n", tokLex.getToken(),
                              tokLex.getLexeme());
      }
      catch (LexanException le)
      {
         System.err.println(le.getMessage());
      }
      catch (LexException le)
      {
         System.err.println(le.getText());
         for (int i = 0; i < le.getBadCharIndex(); i++)
            System.err.print("-");
         System.err.println("^");
         System.err.println(le.getMessage());
      }
      System.out.println();
   }
}
main()لسٽنگ 2 ۾ طريقو lex()ليڪسان استعمال ڪندي ليڪسيڪل تجزيي کي ظاهر ڪرڻ لاءِ هڪ افاديت کي سڏي ٿو. هن طريقي جي هر ڪال کي پاس ڪيو ويو آهي ٽوڪن جي ڪلاس ۾ اعتراض Class۽ اسٽرنگ کي پارس ڪرڻ لاءِ. طريقو lex()پهريون ڀيرو ڪلاس جو هڪ اعتراض ٺاهي ٿو Lexanاعتراض کي Classڪلاس ڪنسٽرڪٽر ڏانهن منتقل ڪندي Lexan. ۽ پوء ان کي سڏي ٿو lex()طبقي جو طريقو Lexanان تار تي. جيڪڏهن ليڪسيڪل تجزيو ڪامياب ٿئي ٿو، طبقاتي TokLexطريقي کي سڏيو ويندو آهي شيون جي فهرست کي واپس ڪرڻ لاء . انهن شين مان هر هڪ لاء، ان جي طبقي جو طريقو سڏيو ويندو آهي ٽوڪن کي واپس ڪرڻ لاء ۽ ان جي طبقي جو طريقو ٽوڪن کي واپس ڪرڻ لاء. ٻئي قدر معياري پيداوار تي ڇپيل آهن. جيڪڏهن لغوي تجزيي ناڪام ٿئي ٿي، انهن مان هڪ استثنا يا اڇلايو وڃي ٿو ۽ ان جي مطابق سنڀاليو وڃي ٿو . اختصار لاءِ، اچو ته صرف ان طبقي تي غور ڪريون جيڪو هن ايپليڪيشن کي ٺاهي ٿو . لسٽنگ 3 ان جو سورس ڪوڊ ڏيکاري ٿو. لسٽنگ 3. ھڪڙي ننڍڙي رياضياتي ٻولي لاء ٽوڪن جي ھڪڙي سيٽ جي وضاحتgetTokLexes()LexangetToken()TokLexgetLexeme()LexanExceptionLexExceptionMathTokens
import ca.javajeff.lexan.Token;

public final class MathTokens
{
   public final static Token FUNC = new Token("FUNC", "sin|cos|exp|ln|sqrt");
   public final static Token LPAREN = new Token("LPAREN", "\\(");
   public final static Token RPAREN = new Token("RPAREN", "\\)");
   public final static Token PLUSMIN = new Token("PLUSMIN", "[+-]");
   public final static Token TIMESDIV = new Token("TIMESDIV", "[*/]");
   public final static Token CARET = new Token("CARET", "\\^");
   public final static Token INTEGER = new Token("INTEGER", "[0-9]+");
   public final static Token ID = new Token("ID", "[a-zA-Z][a-zA-Z0-9_]*");
}
لسٽنگ 3 ڏيکاري ٿو ته ڪلاس MathTokensبيان ڪري ٿو هڪ تسلسل جي تسلسل جي قسم Token. انهن مان هر هڪ شئي جي قيمت مقرر ڪئي وئي آهي Token. ھن اعتراض لاءِ ٺاھيندڙ ھڪڙي اسٽرنگ حاصل ڪري ٿو جيڪو مارڪر جو نالو آھي، ھڪڙو باقاعده اظهار سان گڏ جيڪو بيان ڪري ٿو ان مارڪر سان لاڳاپيل سڀني ڪردارن جي تارن کي. واضح ڪرڻ لاء، اهو ضروري آهي ته مارڪر جي اسٽرنگ جو نالو مسلسل جي نالي سان ساڳيو هجي، پر اهو ضروري ناهي. نشانن جي لسٽ ۾ جاوا ۾ باقاعده اظهار، حصو 5 - 3مسلسل جي پوزيشن اهم آهي. Tokenفهرست ۾ اعليٰ واقعن کي Tokenترجيح ڏني وڃي ٿي جيڪي ھيٺ ڏنل آھن. مثال طور، جڏهن سامهون اچي ٿو sin، ليڪسان کي ٽوڪن FUNCجي بدران چونڊيندو آهي ID. جيڪڏهن مارڪر IDمارڪر جي اڳيان هجي ها FUNCته اهو چونڊيو وڃي ها.

LexanDemo ايپليڪيشن کي گڏ ڪرڻ ۽ هلائڻ

هن آرٽيڪل لاءِ ڊائون لوڊ ڪرڻ واري ڪوڊ ۾ هڪ آرڪائيو شامل آهي lexan.zipجنهن ۾ ليڪسان ورهائڻ جون سڀئي فائلون شامل آهن. demosھن آرڪائيو کي کوليو ۽ روٽ ڊاريڪٽري جي ذيلي ڊاريڪٽري ڏانھن وڃو lexan. جيڪڏھن توھان Windows استعمال ڪري رھيا آھيو، ھيٺ ڏنل حڪم ھلايو ڊيمو ايپليڪيشن سورس ڪوڊ فائلن کي گڏ ڪرڻ لاءِ.
javac -cp ..\library\lexan.jar *.java
جيڪڏهن تاليف ڪامياب آهي، ڊيمو ايپليڪيشن کي هلائڻ لاء هيٺ ڏنل حڪم هلائي.
java -cp ..\library\lexan.jar;. LexanDemo
توھان کي ھيٺين نتيجن کي ڏسڻ گھرجي:
FUNC: sin
LPAREN: (
ID: x
RPAREN: )
TIMESDIV: *
LPAREN: (
INTEGER: 1
PLUSMIN: +
ID: var_12
RPAREN: )
ONE: 1
ZERO: 0
ONE: 1
ZERO: 0
ONE: 1
ONE: 1
ONE: 1
ZERO: 0
1 20
--^
Неожиданный символ во входном тексте: 20
پيغام Неожиданный символ во входном тексте: 20هڪ استثناء جي نتيجي ۾ پيدا ٿئي ٿو LexanExceptionڇاڪاڻ ته حقيقت اها آهي ته ڪلاس هڪ مستقل اظهار جي طور تي هڪ قدر سان BinTokensمسلسل بيان نٿو ڪري . نوٽ ڪريو ته استثنا هينڊلر متن جي ليڪسيڪل تجزيي مان حاصل ڪيل نامناسب ڪردار جي پوزيشن کي ڪڍي ٿو. ٽوڪن غائب پيغام هڪ استثنا جو نتيجو آهي اڇلايو پيو وڃي ڇاڪاڻ ته ڪلاس ۾ ڪوبه مستقل بيان نه ڪيو ويو آهي . Token2LexExceptionNoTokensToken

پردي جي پويان

LexanLexan طبقي کي ان جي انجڻ طور استعمال ڪري ٿو. لسٽنگ 4 ۾ هن طبقي جي عمل تي هڪ نظر وٺو ۽ انجڻ کي ٻيهر استعمال ڪرڻ جي قابل بنائڻ ۾ باقاعده اظهار جي مدد کي نوٽ ڪريو. لسٽنگ 4. ريگيولر ايڪسپريسز جي بنياد تي هڪ ليڪسيڪل اينالائيزر آرڪيٽيڪچر ٺاهڻ
package ca.javajeff.lexan;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;

/**
 *  Лексический анализатор. Этот класс можно использовать для
 *  преобразования входного потока символов в выходной поток маркеров.
 *
 *  @Author Джефф Фризен
 */

public final class Lexan
{
   private List tokLexes;

   private Token[] values;

   /**
    *  Инициализируем лексический анализатор набором an objectов Token.
    *
    *  @параметры tokensClass – an object Class класса, содержащего
    *       набор an objectов Token
    *
    *  @генерирует исключение LexanException в случае невозможности
    *       формирования an object Lexan, возможно, из-за отсутствия an objectов
    *       Token в классе
    */

   public Lexan(Class tokensClass) throws LexanException
   {
      try
      {
         tokLexes = new ArrayList<>();
         List _values = new ArrayList<>();
         Field[] fields = tokensClass.getDeclaredFields();
         for (Field field: fields)
            if (field.getType().getName().equals("ca.javajeff.lexan.Token"))
               _values.add((Token) field.get(null));
         values = _values.toArray(new Token[0]);
         if (values.length == 0)
            throw new LexanException("маркеры отсутствуют");
      }
      catch (IllegalAccessException iae)
      {
         throw new LexanException(iae.getMessage());
      }

   /**
    * Получаем список TokLex'ов этого лексического анализатора.
    *
    *  @возвращает список TokLex'ов
    */

   public List getTokLexes()
   {
      return tokLexes;
   }

   /** * Выполняет лексический анализ входной строки [с помещением * результата] в список TokLex'ов. * * @параметры str – строка, подвергаемая лексическому анализу * * @генерирует исключение LexException: во входных данных обнаружен * неожиданный символ */

   public void lex(String str) throws LexException
   {
      String s = new String(str).trim(); // удалить ведущие пробелы
      int index = (str.length() - s.length());
      tokLexes.clear();
      while (!s.equals(""))
      {
         boolean match = false;
         for (int i = 0; i < values.length; i++)
         {
            Token token = values[i];
            Matcher m = token.getPattern().matcher(s);
            if (m.find())
            {
               match = true;
               tokLexes.add(new TokLex(token, m.group().trim()));
               String t = s;
               s = m.replaceFirst("").trim(); // удалить ведущие пробелы
               index += (t.length() - s.length());
               break;
            }
         }
         if (!match)
            throw new LexException("Неожиданный символ во входном тексте: "
                                    + s, str, index);
      }
   }
}
طريقو ڪوڊ lex()بلاگ پوسٽ ۾ ڏنل ڪوڊ تي ٻڌل آهي "جاوا ۾ هڪ پارسر لکڻ: هڪ ٽوڪن جنريٽر" ڪوگيٽو لرننگ ويب سائيٽ تي. هي پوسٽ پڙهو وڌيڪ سکڻ لاءِ ته ڪيئن Lexan استعمال ڪري ٿو Regex API ڪوڊ گڏ ڪرڻ لاءِ. جاوا ۾ باقاعده اظهار، حصو 5 - 4

نتيجو

باقاعده اظهار هڪ مفيد اوزار آهي جيڪو ڪنهن به ڊولپر لاء ڪارائتو ٿي سگهي ٿو. جاوا پروگرامنگ ٻولي جو Regex API انهن کي ايپليڪيشنن ۽ لائبريرين ۾ استعمال ڪرڻ آسان بڻائي ٿو. ھاڻي ته توھان وٽ اڳ ۾ ئي بنيادي سمجھاڻي آھي ريگيولر ايڪسپريشنز ۽ ھي API، ڏسو SDK ڊاڪيومينٽيشن کي java.util.regexوڌيڪ سکڻ لاءِ ريگولر ايڪسپريشنز ۽ اضافي Regex API طريقن بابت.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION