ہم آپ کی توجہ کے لیے جاوا میں ریگولر ایکسپریشنز کے لیے ایک مختصر گائیڈ کا ترجمہ پیش کرتے ہیں، جسے جیف فریسن نے javaworld ویب سائٹ کے لیے لکھا ہے۔ پڑھنے میں آسانی کے لیے ہم نے مضمون کو کئی حصوں میں تقسیم کیا ہے۔ یہ حصہ آخری حصہ ہے۔ جاوا میں ریگولر ایکسپریشنز، حصہ 1 جاوا میں ریگولر ایکسپریشنز، پارٹ 2 جاوا میں ریگولر ایکسپریشنز، پارٹ 3 جاوا میں ریگولر ایکسپریشنز، پارٹ 4
ریگولر ایکسپریشن ریاست پر مبنی لغوی تجزیہ کاروں کے مقابلے میں بہت زیادہ کارآمد ہیں، جنہیں ہاتھ سے لکھا جانا چاہیے اور عام طور پر دوبارہ استعمال نہیں کیا جا سکتا۔ ریگولر ایکسپریشن پر مبنی لغوی تجزیہ کار کی ایک مثال JLex ہے ، جو جاوا لینگویج کے لیے ایک لغوی جنریٹر ہے جو ان پٹ ڈیٹا اسٹریم کو ٹوکنز میں توڑنے کے لیے قواعد کی وضاحت کے لیے ریگولر ایکسپریشنز کا استعمال کرتا ہے۔ ایک اور مثال لیکسن ہے۔
لغوی تجزیہ کے لیے ریگولر ایکسپریشنز کا استعمال
ریگولر ایکسپریشنز کی ایک اور بھی مفید ایپلی کیشن لغوی تجزیہ کرنے کے لیے دوبارہ قابل استعمال کوڈ کی ایک لائبریری ہے، جو کسی بھی کمپائلر یا اسمبلر کا کلیدی جزو ہے۔ اس صورت میں، حروف کے ان پٹ سٹریم کو ٹوکنز کے ایک آؤٹ پٹ سٹریم میں گروپ کیا جاتا ہے - حروف کی ترتیب کے نام جن کا ایک عام مطلب ہوتا ہے۔ مثال کے طور پر، ان پٹ سٹریم میں حروف کی ترتیبc
, o
, u
, n
, t
, e
, r
, کا سامنا کرنے کے بعد، لغوی تجزیہ کار ایک ٹوکن ID
(شناخت کنندہ) کو آؤٹ پٹ کر سکتا ہے۔ ٹوکن کے مطابق حروف کی ترتیب کو لیکسیم کہا جاتا ہے۔
مارکر اور لیکسیم کے بارے میں مزید |
---|
ID جیسے ٹوکن بہت سے حروف کی ترتیب سے مل سکتے ہیں۔ اس طرح کے ٹوکن کی صورت میں، ٹوکن سے مطابقت رکھنے والے اصل ٹوکن کی بھی کمپائلر، اسمبلر، یا دیگر افادیت کی ضرورت ہوتی ہے جس کے لیے لغوی تجزیہ کی ضرورت ہوتی ہے۔ ایسے ٹوکنز کے لیے جو حروف کی ایک مخصوص ترتیب کی نمائندگی کرتے ہیں، جیسے کہ PLUS صرف کریکٹر سے متعلق ٹوکن + ، اصل ٹوکن کی ضرورت نہیں ہے کیونکہ اسے ٹوکن سے پہچانا جا سکتا ہے۔ |
لیکسن کو جاننا
لیکسان لغوی تجزیہ کے لیے دوبارہ قابل استعمال جاوا لائبریری ہے۔ یہ کوگیٹو لرننگ ویب سائٹ پر جاوا میں ایک پارسر لکھنا بلاگ پوسٹ سیریز کے کوڈ پر مبنی ہے ۔ لائبریری مندرجہ ذیل کلاسوں پر مشتمل ہے، جو اس مضمون کے ڈاؤن لوڈ کے قابل کوڈ میں شامل پیکیج میں ہیں:ca.javajeff.lexan
Lexan
: لغوی تجزیہ کارLexException
اگر لغوی تجزیہ کے دوران غلط نحو کا پتہ چل جائے تو استثنیٰ دیا جاتا ہے۔Token
: باقاعدہ اظہار وصف کے ساتھ نام؛TokLex
: ٹوکن/ٹوکن جوڑا۔
LexanException
: کلاس کنسٹرکٹر میں رعایت پھینکی گئی۔Lexan;
Lexan(java.lang.Class tokensClass)
ایک نیا لغوی تجزیہ کار بناتا ہے۔ اسے کلاس آبجیکٹ کی شکل میں ایک دلیل کی ضرورت ہوتی ہے java.lang.Class
جو ٹائپ constant کلاس سے مماثل ہو static Token
۔ Reflection API کا استعمال کرتے ہوئے، کنسٹرکٹر تمام مستقل کو Token
اقدار کی ایک صف میں پڑھتا ہے Token[]
۔ اگر Token
کوئی مستقل نہیں ہے تو، ایک استثناء پھینک دیا جاتا ہے LexanException
. کلاس 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. ایک چھوٹی ریاضی کی زبان کے لیے ٹوکن کے سیٹ کی تفصیلLexan
Class
Lexan
lex()
Lexan
TokLex
getTokLexes()
Lexan
getToken()
TokLex
getLexeme()
LexanException
LexException
MathTokens
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
۔ اس آبجیکٹ کے کنسٹرکٹر کو ایک سٹرنگ ملتی ہے جو مارکر کا نام ہے، اس کے ساتھ ایک ریگولر ایکسپریشن جو اس مارکر سے وابستہ تمام کریکٹر سٹرنگز کو بیان کرتا ہے۔ وضاحت کے لیے، یہ ضروری ہے کہ مارکر کے سٹرنگ کا نام مستقل کے نام جیسا ہی ہو، لیکن یہ ضروری نہیں ہے۔ مارکروں کی فہرست میں مستقل کی پوزیشن اہم ہے۔ 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
کسی مستقل کا اعلان نہیں کرتی ہے ۔ نوٹ کریں کہ استثنیٰ ہینڈلر متن کے لغوی تجزیہ سے حاصل کردہ نامناسب کردار کی پوزیشن کو ظاہر کرتا ہے۔ ٹوکنز کا غائب ہونا ایک استثناء کے پھینکے جانے کا نتیجہ ہے کیونکہ کلاس میں کسی بھی مستقل کا اعلان نہیں کیا جاتا ہے ۔ Token
2
LexException
NoTokens
Token
پردے کے پیچھے
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 کا استعمال کیسے کرتا ہے۔
نتیجہ
ریگولر ایکسپریشن ایک مفید ٹول ہے جو کسی بھی ڈویلپر کے لیے کارآمد ہو سکتا ہے۔ جاوا پروگرامنگ زبان کا Regex API انہیں ایپلی کیشنز اور لائبریریوں میں استعمال کرنا آسان بناتا ہے۔ اب جب کہ آپ کو پہلے سے ہی ریگولر ایکسپریشنز اور اس API کی بنیادی سمجھ ہے،java.util.regex
ریگولر ایکسپریشنز اور اضافی Regex API طریقوں کے بارے میں مزید جاننے کے لیے SDK دستاویزات پر ایک نظر ڈالیں۔
GO TO FULL VERSION