JavaRush /جاوا بلاگ /Random-UR /جاوا میں باقاعدہ اظہار، حصہ 5

جاوا میں باقاعدہ اظہار، حصہ 5

گروپ میں شائع ہوا۔
ہم آپ کی توجہ کے لیے جاوا میں ریگولر ایکسپریشنز کے لیے ایک مختصر گائیڈ کا ترجمہ پیش کرتے ہیں، جسے جیف فریسن نے javaworld ویب سائٹ کے لیے لکھا ہے۔ پڑھنے میں آسانی کے لیے ہم نے مضمون کو کئی حصوں میں تقسیم کیا ہے۔ یہ حصہ آخری حصہ ہے۔ جاوا میں ریگولر ایکسپریشنز، حصہ 5 - 1جاوا میں ریگولر ایکسپریشنز، حصہ 1 جاوا میں ریگولر ایکسپریشنز، پارٹ 2 جاوا میں ریگولر ایکسپریشنز، پارٹ 3 جاوا میں ریگولر ایکسپریشنز، پارٹ 4

لغوی تجزیہ کے لیے ریگولر ایکسپریشنز کا استعمال

ریگولر ایکسپریشنز کی ایک اور بھی مفید ایپلی کیشن لغوی تجزیہ کرنے کے لیے دوبارہ قابل استعمال کوڈ کی ایک لائبریری ہے، جو کسی بھی کمپائلر یا اسمبلر کا کلیدی جزو ہے۔ اس صورت میں، حروف کے ان پٹ سٹریم کو ٹوکنز کے ایک آؤٹ پٹ سٹریم میں گروپ کیا جاتا ہے - حروف کی ترتیب کے نام جن کا ایک عام مطلب ہوتا ہے۔ مثال کے طور پر، ان پٹ سٹریم میں حروف کی ترتیب c, o, u, n, t, e, r, کا سامنا کرنے کے بعد، لغوی تجزیہ کار ایک ٹوکن ID(شناخت کنندہ) کو آؤٹ پٹ کر سکتا ہے۔ ٹوکن کے مطابق حروف کی ترتیب کو لیکسیم کہا جاتا ہے۔
مارکر اور لیکسیم کے بارے میں مزید
ID جیسے ٹوکن بہت سے حروف کی ترتیب سے مل سکتے ہیں۔ اس طرح کے ٹوکن کی صورت میں، ٹوکن سے مطابقت رکھنے والے اصل ٹوکن کی بھی کمپائلر، اسمبلر، یا دیگر افادیت کی ضرورت ہوتی ہے جس کے لیے لغوی تجزیہ کی ضرورت ہوتی ہے۔ ایسے ٹوکنز کے لیے جو حروف کی ایک مخصوص ترتیب کی نمائندگی کرتے ہیں، جیسے کہ PLUSصرف کریکٹر سے متعلق ٹوکن +، اصل ٹوکن کی ضرورت نہیں ہے کیونکہ اسے ٹوکن سے پہچانا جا سکتا ہے۔
ریگولر ایکسپریشن ریاست پر مبنی لغوی تجزیہ کاروں کے مقابلے میں بہت زیادہ کارآمد ہیں، جنہیں ہاتھ سے لکھا جانا چاہیے اور عام طور پر دوبارہ استعمال نہیں کیا جا سکتا۔ ریگولر ایکسپریشن پر مبنی لغوی تجزیہ کار کی ایک مثال JLex ہے ، جو جاوا لینگویج کے لیے ایک لغوی جنریٹر ہے جو ان پٹ ڈیٹا اسٹریم کو ٹوکنز میں توڑنے کے لیے قواعد کی وضاحت کے لیے ریگولر ایکسپریشنز کا استعمال کرتا ہے۔ ایک اور مثال لیکسن ہے۔

لیکسن کو جاننا

لیکسان لغوی تجزیہ کے لیے دوبارہ قابل استعمال جاوا لائبریری ہے۔ یہ کوگیٹو لرننگ ویب سائٹ پر جاوا میں ایک پارسر لکھنا بلاگ پوسٹ سیریز کے کوڈ پر مبنی ہے ۔ لائبریری مندرجہ ذیل کلاسوں پر مشتمل ہے، جو اس مضمون کے ڈاؤن لوڈ کے قابل کوڈ میں شامل پیکیج میں ہیں:ca.javajeff.lexan
  • Lexan: لغوی تجزیہ کار
  • LexanException: کلاس کنسٹرکٹر میں رعایت پھینکی گئی۔Lexan;
  • LexExceptionاگر لغوی تجزیہ کے دوران غلط نحو کا پتہ چل جائے تو استثنیٰ دیا جاتا ہے۔
  • Token: باقاعدہ اظہار وصف کے ساتھ نام؛
  • TokLex: ٹوکن/ٹوکن جوڑا۔
کنسٹرکٹر Lexan(java.lang.Class tokensClass)ایک نیا لغوی تجزیہ کار بناتا ہے۔ اسے کلاس آبجیکٹ کی شکل میں ایک دلیل کی ضرورت ہوتی ہے java.lang.Classجو ٹائپ constant کلاس سے مماثل ہو static Token۔ Reflection API کا استعمال کرتے ہوئے، کنسٹرکٹر تمام مستقل کو 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()کلاس کا ایک آبجیکٹ بناتا ہے ۔ اور پھر یہ اس سٹرنگ پر کلاس کا طریقہ کہتا ہے۔ اگر لغوی تجزیہ کامیاب ہو جاتا ہے تو، کلاس طریقہ کو اشیاء کی فہرست واپس کرنے کے لیے کہا جاتا ہے ۔ ان میں سے ہر ایک آبجیکٹ کے لیے، اس کا کلاس طریقہ ٹوکن واپس کرنے کے لیے کہا جاتا ہے اور اس کا کلاس طریقہ ٹوکن واپس کرنے کے لیے کہا جاتا ہے۔ دونوں قدریں معیاری آؤٹ پٹ پر پرنٹ کی جاتی ہیں۔ اگر لغوی تجزیہ ناکام ہو جاتا ہے تو مستثنیات میں سے ایک یا پھینک دیا جاتا ہے اور اس کے مطابق ہینڈل کیا جاتا ہے ۔ اختصار کے لیے، آئیے صرف اس کلاس پر غور کریں جو اس ایپلی کیشن کو بناتا ہے ۔ فہرست 3 اس کا سورس کوڈ دکھاتی ہے۔ فہرست 3. ایک چھوٹی ریاضی کی زبان کے لیے ٹوکن کے سیٹ کی تفصیلLexanClassLexanlex()LexanTokLexgetTokLexes()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۔ اگر آپ ونڈوز استعمال کر رہے ہیں تو ڈیمو ایپلیکیشن سورس کوڈ فائلوں کو مرتب کرنے کے لیے درج ذیل کمانڈ کو چلائیں۔
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

پردے کے پیچھے

Lexanلیکسن کلاس کو اپنے انجن کے طور پر استعمال کرتا ہے۔ فہرست 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() میں فراہم کردہ کوڈ پر ہے ۔ اس بارے میں مزید جاننے کے لیے اس پوسٹ کو پڑھیں کہ لیکسان کوڈ کو مرتب کرنے کے لیے Regex API کا استعمال کیسے کرتا ہے۔ جاوا میں باقاعدہ اظہار، حصہ 5 - 4

نتیجہ

ریگولر ایکسپریشن ایک مفید ٹول ہے جو کسی بھی ڈویلپر کے لیے کارآمد ہو سکتا ہے۔ جاوا پروگرامنگ زبان کا Regex API انہیں ایپلی کیشنز اور لائبریریوں میں استعمال کرنا آسان بناتا ہے۔ اب جب کہ آپ کو پہلے سے ہی ریگولر ایکسپریشنز اور اس API کی بنیادی سمجھ ہے، java.util.regexریگولر ایکسپریشنز اور اضافی Regex API طریقوں کے بارے میں مزید جاننے کے لیے SDK دستاویزات پر ایک نظر ڈالیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION