الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تمييز " تحليل " النص المدخل بال TEXTBOX

بدأه Ms.Nada في 22 أبريل 2010 · 37 رد · 5,960 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ..~

كيف الح‘ـال جميعا ..~

أريد مساعدة أو شرح طريقة لبرنامجي ..~

البرنامج لمادة Compiler

lexical analyzer

وهو مطلوب بالـ c#

لن أطول عليكم البرنامج يحلل النص المدخل إليه ..~

فمثلا عند أدخال النص بالتكست بوكس

1234.234 يتم حسابه بأنه رقم

as435 يتم حسابة بأنه كلمة

وهكذا

لدي نتيجة البرنامج بالسي بلس فقط دون الكود :wink:

كنت متمكنة من السي شارب لكن قد نسيتها لتوقفي عن الدراسة مدة سنة كاملة لظروف صحيه

هذا الكود الذي كتبته عذرا فهو كود مبتدئة


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace lexical
{

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private string Exract_number(string epr)
{
string result=null;
char letter;
for (int i = 0; i < epr.Length; i++)
{
letter = Convert.ToChar(epr.Substring(i, 1));
if (char.IsNumber(letter))
{
result += letter.ToString();
}
}
return result;
}

private string Exract_letter(string epr)
{
string result = null;
char letter;
for (int i = 0; i < epr.Length; i++)
{
letter = Convert.ToChar(epr.Substring(i, 1));
if (char.IsLetter(letter))
{
result += letter.ToString();
}
}
return result;
}
private string Exract_symbol(string epr)
{
string result = null;
char letter;
for (int i = 0; i < epr.Length; i++)
{
letter = Convert.ToChar(epr.Substring(i, 1));
if (char.IsSymbol(letter))
{
result += letter.ToString();
}
}
return result;
}


private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = Exract_number(textBox1.Text);
textBox3.Text = Exract_letter(textBox1.Text);
textBox4.Text = Exract_symbol(textBox1.Text);
//textBox5.Text = spc_letter (textBox2.Text);
}
}
}

نتيجة برنامجي ..

jpszz90kcehi.jpg

نتيجة المطلوبة مني ..~

مرسلة من أحدى الطالبات دون الكود :unsure:

uitmqo2ev2im.png

#2

أبحاول اساعدك اختي بس ياليت تشرحين البرنامج المطلوب بشكل أكثر ..

هل قصدك إذا كان فيه حرف في الجملة المدخل يعتبرها البرنامج كلمة.؟وإذا لم يوجد أي حرف يعتبر رقم؟؟؟

1
118650.jpg
#4

تعديل بسيط فى الكود فى الصفحه التى وضعها أخى Moudey

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.RegularExpressions;

namespace LambdaCalc
{
    // Tokens that represent the input
    internal enum Token
    {
        OpenParan, CloseParan,
        Arrow,
        Comma,
        Period,
        Plus, Minus, Multiply, Divide,
        Number,
        Identifier,
        Other       // Represents unrecognized charachters
    }

    // Scanner used to find the tokens from a calc lampda string expression
    internal static class LambdaCalcScanner
    {
        // The pattern used with the regular expression class to scan the input
        const string Pattern = @"
                        (?'OpenParan' \( ) | (?'CloseParan' \) ) |
                        (?'Arrow' => ) |
                        (?'Comma' ,  ) |
                        (?'Period' \.  ) |
                        (?'Plus' \+ ) | (?'Minus' - ) | (?'Multiply' \* ) | (?'Divide' / ) |
                        (?'Number' (\.\d+|\d+(\.\d+)?) ) |
                        (?'Identifier' [a-zA-Z]\w* ) |
                        (?'Other' [^ \r\n\t])";

        // Regular expression used to scan the input
        private static Regex MathRegex = new Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);

        // Enumurable to get tokens from the given expression (scanner)
        public static IEnumerable<TokenEntity> GetLambdaCalcTokens(this string exp)
        {
            Token[] tokens = Enum.GetValues(typeof(Token)).OfType<Token>().ToArray();
            foreach (Match m in MathRegex.Matches(exp))
            {
                // Check which token is matched by this match object
                foreach (Token token in tokens)
                {
                    if (m.Groups[token.ToString()].Success)
                    {
                        yield return new TokenEntity(
                            token,
                            m.Index,
                            m.Value);
                    }
                }
            }
            // return the end string token, to indecate we are done
            yield return new TokenEntity(Token.Other, exp.Length, "\0");
        }
    }

    // Holds token info
    internal class TokenEntity
    {
        public TokenEntity(Token token, int startPos, string value)
        {
            this.Token = token;
            this.StartPos = startPos;
            this.Value = value;
        }

        // Token type
        public Token Token { get; private set; }

        // Start position in the original string
        public int StartPos { get; private set; }

        // Value
        public string Value { get; private set; }

        public override string ToString()
        {

            return string.Format( Value.PadRight(13) + "                    " + Token);

        }
    }

    /// <summary>
    /// Test program
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Type Your Code Here :");
            string st = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("LEXEME" + "                                 " + "Token");
            Console.WriteLine("=======" + "                               " + "=========");
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                Console.WriteLine(t);
            }
        }
    }

}

post-207223-12720136026192_thumb.jpg

تم تعديل هذه المشاركة بواسطة عمرو الصعيدي في 23 أبريل 2010 في 12:08

1

 وممّا زادنـــي شرفــاً وتيهــاً   **  وكدت بأخمصي أطأ الثريّا

دخولي تحت قولك يا عبادي  **   وأن صيّرت أحمد لي نبيّـاً

#5
azooz-tamimi كتب:

أبحاول اساعدك اختي بس ياليت تشرحين البرنامج المطلوب بشكل أكثر ..

هل قصدك إذا كان فيه حرف في الجملة المدخل يعتبرها البرنامج كلمة.؟وإذا لم يوجد أي حرف يعتبر رقم؟؟؟

البرنامج يمشي على تي جي محدد

اللي تقول عنه هذا سويته ببرنامجي ..

لكن البرنامج المطلوب اذا بدا بحرف مثل as234678

يعتد المدخل identfier يعني كلمة

والأرقام

طريقتها انه يقرا الارقام صادف "." يقرا احرف اللي بعده

اذا كان رقم يكمل باعتباره رقم والخ ,,,

الله يسعدك خيو ..~

بتسوي فيني خير :blush:

#7
عمرو الصعيدي كتب:

تعديل بسيط فى الكود فى الصفحه التى وضعها أخى Moudey

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.RegularExpressions;

namespace LambdaCalc
{
    // Tokens that represent the input
    internal enum Token
    {
        OpenParan, CloseParan,
        Arrow,
        Comma,
        Period,
        Plus, Minus, Multiply, Divide,
        Number,
        Identifier,
        Other       // Represents unrecognized charachters
    }

    // Scanner used to find the tokens from a calc lampda string expression
    internal static class LambdaCalcScanner
    {
        // The pattern used with the regular expression class to scan the input
        const string Pattern = @"
                        (?'OpenParan' \( ) | (?'CloseParan' \) ) |
                        (?'Arrow' => ) |
                        (?'Comma' ,  ) |
                        (?'Period' \.  ) |
                        (?'Plus' \+ ) | (?'Minus' - ) | (?'Multiply' \* ) | (?'Divide' / ) |
                        (?'Number' (\.\d+|\d+(\.\d+)?) ) |
                        (?'Identifier' [a-zA-Z]\w* ) |
                        (?'Other' [^ \r\n\t])";

        // Regular expression used to scan the input
        private static Regex MathRegex = new Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);

        // Enumurable to get tokens from the given expression (scanner)
        public static IEnumerable<TokenEntity> GetLambdaCalcTokens(this string exp)
        {
            Token[] tokens = Enum.GetValues(typeof(Token)).OfType<Token>().ToArray();
            foreach (Match m in MathRegex.Matches(exp))
            {
                // Check which token is matched by this match object
                foreach (Token token in tokens)
                {
                    if (m.Groups[token.ToString()].Success)
                    {
                        yield return new TokenEntity(
                            token,
                            m.Index,
                            m.Value);
                    }
                }
            }
            // return the end string token, to indecate we are done
            yield return new TokenEntity(Token.Other, exp.Length, "\0");
        }
    }

    // Holds token info
    internal class TokenEntity
    {
        public TokenEntity(Token token, int startPos, string value)
        {
            this.Token = token;
            this.StartPos = startPos;
            this.Value = value;
        }

        // Token type
        public Token Token { get; private set; }

        // Start position in the original string
        public int StartPos { get; private set; }

        // Value
        public string Value { get; private set; }

        public override string ToString()
        {

            return string.Format( Value.PadRight(13) + "                    " + Token);

        }
    }

    /// <summary>
    /// Test program
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Type Your Code Here :");
            string st = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("LEXEME" + "                                 " + "Token");
            Console.WriteLine("=======" + "                               " + "=========");
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                Console.WriteLine(t);
            }
        }
    }

}

جربت الكود ..~

وكتبت سطر readline

عشان يثبت الرن بس ع طول تختفي :blink: ...~

خيو الله يرضى عليك ممكن تشرحه لي :blush:

تسلم كثير

#8

أختى الكريمه أكيد عندك مشكله فى ال VS

الكود شغال تمام

ابحثى عن المشكله

 وممّا زادنـــي شرفــاً وتيهــاً   **  وكدت بأخمصي أطأ الثريّا

دخولي تحت قولك يا عبادي  **   وأن صيّرت أحمد لي نبيّـاً

#9
عمرو الصعيدي كتب:

أختى الكريمه أكيد عندك مشكله فى ال VS

الكود شغال تمام

ابحثى عن المشكله

بحثت مافي مشكلة:blink:

شغال تمام وجربت برنامج كونسول ثاني

وتأكدت تسلم اخوي بحاول مرة ثانيه :happy:

تم تعديل هذه المشاركة بواسطة Ms.Nada في 23 أبريل 2010 في 16:06

#10
Ms.Nada كتب:

جربت الكود ..~

وكتبت سطر readline

عشان يثبت الرن بس ع طول تختفي :blink: ...~

خيو الله يرضى عليك ممكن تشرحه لي :blush:

تسلم كثير

عشان تثبتي البرنامج ولايطلع علطول اضيفي هذا الكود في ال Main

Console.ReadKey();

وهذا ال Main بعد التعديل :-

 static void Main(string[] args)
        {
            Console.WriteLine("Type Your Code Here :");
            string st = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("LEXEME" + "                                 " + "Token");
            Console.WriteLine("=======" + "                               " + "=========");
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                Console.WriteLine(t);
            }
            Console.WriteLine("Press any Key To Exit...");
            Console.ReadKey();
        }

وأي مساعدة أناحاضر ...

118650.jpg
#11

أخى azooz-tamimi

البرنامج بدون اضافة Console.ReadKey(); لازم يثبت ولايختفى

لأنه يطلب ادخال بيانات من المستخحدم عن طريق Console.ReadLine();

 وممّا زادنـــي شرفــاً وتيهــاً   **  وكدت بأخمصي أطأ الثريّا

دخولي تحت قولك يا عبادي  **   وأن صيّرت أحمد لي نبيّـاً

#12

انا جربت البرنامج لكن بعد عرض البيانات يختفي علطول ولا فيه فرصة لإلقاء نظرة على الناتج..

118650.jpg
#13

أخى مافى مشكله كنت أعتقد أن البرنامج يختفى قبل ادخال البيانات

حيث أننى كنت أعمل without Debug

 وممّا زادنـــي شرفــاً وتيهــاً   **  وكدت بأخمصي أطأ الثريّا

دخولي تحت قولك يا عبادي  **   وأن صيّرت أحمد لي نبيّـاً

#14

تحصل ... :)

118650.jpg
#15

مثال اخر بتقنية LL parser

http://en.wikipedia.org/wiki/LL_parser

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace LLParser
{
	using TokenStream = System.Collections.Generic.IEnumerator<Token>;

	public enum Kind { EOF, PLUS, MINUS, MULT, DIV, MOD, LPAR, RPAR, NUM, IDENT, COMA, ERROR}

	public struct Token
	{
		public readonly Kind kind;
		public readonly string nval;

		public Token(Kind k, string v) 
		{ 
			this.kind = k; 
			this.nval = v; 
		}

		public override string ToString()
		{
			return string.Format("{0}\t{1}", kind.ToString(), this.nval);
		}

		static public Token FromKind(Kind k)
		{
			return new Token(k, null); 
		}

		static public Token FromKind(Kind k, string v)
		{
			return new Token(k, v); 
		}
	}

	public interface IScanner
	{
		TokenStream Scan(TextReader reader);
	}

	class Scanner : IScanner
	{
		public TokenStream Scan(TextReader reader)
		{
			IList<Token> tokenList = new List<Token>();
			while(reader.Peek() != -1)
			{
				if(Char.IsWhiteSpace((char)reader.Peek()))
				{
					reader.Read();
				}
				else if(Char.IsDigit((char)reader.Peek()))
				{
					string val = null;
					val += (char)reader.Read();
					while(Char.IsDigit((char)reader.Peek())) 
					{
						val += (char)reader.Read();
					}
					if(reader.Peek() == '.')
					{
						val += (char)reader.Read();
						while(Char.IsDigit((char)reader.Peek()))
						{
							val += (char)reader.Read();
						}
					}
					tokenList.Add(new Token(Kind.NUM, val));
				}
				else if(Char.IsLetter((char)reader.Peek()))
				{
					string val = null;
					val += (char)reader.Read();
					while(
						Char.IsDigit((char)reader.Peek()) || 
						Char.IsLetter((char)reader.Peek()))
					{
						val += (char)reader.Read();
					}
					tokenList.Add(new Token(Kind.IDENT, val));
				}
				else
				{
					char c = (char)reader.Read();
					switch(c)
					{
						case '+': tokenList.Add(Token.FromKind(Kind.PLUS,	"+"));	break;
						case '-': tokenList.Add(Token.FromKind(Kind.MINUS,	"-"));	break;
						case '*': tokenList.Add(Token.FromKind(Kind.MULT,	"*"));	break;
						case '/': tokenList.Add(Token.FromKind(Kind.DIV,	"/")); 	break;
						case '%': tokenList.Add(Token.FromKind(Kind.MOD,	"%")); 	break;
						case ',': tokenList.Add(Token.FromKind(Kind.COMA,	",")); 	break;
						case '(': tokenList.Add(Token.FromKind(Kind.LPAR,	"("));	break;
						case ')': tokenList.Add(Token.FromKind(Kind.RPAR,	")"));	break;
						default:
							tokenList.Add(Token.FromKind(Kind.ERROR, c.ToString()));break;
					}
				}
			}
			tokenList.Add(Token.FromKind(Kind.EOF));
			return tokenList.GetEnumerator();
		}
	}

	class Test
	{
		public static void Main(string[] args)
		{
			try
			{
				TextReader r = new StringReader("135.43!as12^234E34-sdme,,, then ... if");
				IScanner scanner = new Scanner();
				TokenStream t = scanner.Scan(r);
				Console.WriteLine("Token" + "\t" + "LEXEME");
            	Console.WriteLine("=======" + "\t" + "=========");

				while(t.MoveNext())
				{
					Console.WriteLine(t.Current.ToString());
				}
			}
			catch(Exception ex)
			{
				Console.WriteLine(ex.Message);
			}
			Console.ReadLine();
		}
	}
}

مواضيع متنوعة

#16
azooz-tamimi كتب:

عشان تثبتي البرنامج ولايطلع علطول اضيفي هذا الكود في ال Main

Console.ReadKey();

وهذا ال Main بعد التعديل :-

 static void Main(string[] args)
        {
            Console.WriteLine("Type Your Code Here :");
            string st = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("LEXEME" + "                                 " + "Token");
            Console.WriteLine("=======" + "                               " + "=========");
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                Console.WriteLine(t);
            }
            Console.WriteLine("Press any Key To Exit...");
            Console.ReadKey();
        }

وأي مساعدة أناحاضر ...

ربي يسعد قلب أمك عزوز :wub:

تمام .. من العصر حايسه بحوله windows application form

بأنه يقرا من text box ويظهره بـ text box ثاني ...~

وجبت البرنامج بالـ c++ من البنات الدكتور يبيه سي شارب

هذا رابط البرنامج

http://arabsh.com/pudtivee8v35.html

إذا تقدر تفيدني ... كيف أخلي البرنامج يقرا محتوى التكست بوكس ويحلله مثل برنامج الكونسول

ويطلع النتائج هذا اللي معقدني بالبرنامج ... فاهمه الفكره بس التعبير بالسي شارب جدا صعب

لاني من زمان عن اللغه وماني قادرة اركز فين ابدا وايش اسوي :(

كانت سهله اول بس الحين مرة صعبه .. بأنتظار ردك ... كيف احول برنامج الكونسول لبرنامج ابلكيشن

واسفه كثير ثقلت عليكم :blush:

وأن شاء الله تساعدوني :happy:

تم تعديل هذه المشاركة بواسطة Ms.Nada في 25 أبريل 2010 في 04:33

#17

(تعديل بسيط بالكود)

لاثقلتي علينا ولاشي وش دعوا ..:)

بالنسبة لطلبك كل الي تحتاجينة تغيير أكواد الإدخال والإخراج لتتناسب مع الويندوز أبليكشن ..:)

مثلا :-

Console.ReadLine();

تستبدل بـ :

textbox.Text=value;

وهذا الكود كامل بالويندوز فورمز .. :

قبل الكود ادرجي مربعين نص الأول اسمه : codetext

والثاني اسمه : textbox1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace LCalc
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textbox1.Text = "LEXEME                             Token                                            ";
            string st = codetext.Text;
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                textbox1.Text += t + "                                                  ";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }



    internal enum Token
    {
        OpenParan, CloseParan,
        Arrow,
        Comma,
        Period,
        Plus, Minus, Multiply, Divide,
        Number,
        Identifier,
        Other       // Represents unrecognized charachters
    }
    internal static class LambdaCalcScanner
    {
        // The pattern used with the regular expression class to scan the input
        const string Pattern = @"
                        (?'OpenParan' \( ) | (?'CloseParan' \) ) |
                        (?'Arrow' => ) |
                        (?'Comma' ,  ) |
                        (?'Period' \.  ) |
                        (?'Plus' \+ ) | (?'Minus' - ) | (?'Multiply' \* ) | (?'Divide' / ) |
                        (?'Number' (\.\d+|\d+(\.\d+)?) ) |
                        (?'Identifier' [a-zA-Z]\w* ) |
                        (?'Other' [^ \r\n\t])";

        // Regular expression used to scan the input
        private static Regex MathRegex = new Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);

        // Enumurable to get tokens from the given expression (scanner)
        public static IEnumerable<TokenEntity> GetLambdaCalcTokens(this string exp)
        {
            Token[] tokens = Enum.GetValues(typeof(Token)).OfType<Token>().ToArray();
            foreach (Match m in MathRegex.Matches(exp))
            {
                // Check which token is matched by this match object
                foreach (Token token in tokens)
                {
                    if (m.Groups[token.ToString()].Success)
                    {
                        yield return new TokenEntity(
                            token,
                            m.Index,
                            m.Value);
                    }
                }
            }
            // return the end string token, to indecate we are done
            yield return new TokenEntity(Token.Other, exp.Length, "\0");
        }
    }
    internal class TokenEntity
    {
        public TokenEntity(Token token, int startPos, string value)
        {
            this.Token = token;
            this.StartPos = startPos;
            this.Value = value;
        }

        // Token type
        public Token Token { get; private set; }

        // Start position in the original string
        public int StartPos { get; private set; }

        // Value
        public string Value { get; private set; }

        public override string ToString()
        {

            return string.Format(Value.PadRight(13) + "                    " + Token);

        }
    }
}

وملف المشروع بالمرفق .. :)

LCalc.rar

تم تعديل هذه المشاركة بواسطة azooz-tamimi في 25 أبريل 2010 في 23:58

118650.jpg
#18

وش صار معك ..؟ :happy:

118650.jpg
#19

مررررا شكرا عزوز

ألف ألف شكر لك .. معليش كان عندي اختبار وما قدرت ارد

مرا تمام وضفت فيه حاجات اللي يبيها الدكتور تطلع

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace LCalc
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textbox1.Text = "LEXEME==========================Token \t\t";
            string st = codetext.Text;
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                textbox1.Text += t + "\t\t\t\t";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }



    internal enum Token
    {
        OpenParan, CloseParan,
        Arrow,
        Comma,
        Period,
        Plus, Minus, Multiply, Divide,
        Number,
        Identifier,
        relop,
        delim,
      sign,
        lexical_error
    }
    internal static class LambdaCalcScanner
    {

        const string Pattern = @"
                        (?'sign' [\= \+ \- \* \^ ])|
                        (?'delim' [\ \r \n \t \b])|
                        (?'relop' [\< \> \= ])|
                        (?'Number' (\d+(\.\d+)?) ) |
                        (?'Identifier' [a-zA-Z]\w* ) |
                        (?'lexical_error' [\. \) \( \: \; \@ \# \, \! \£ \$ \% \&   ])";


        private static Regex MathRegex = new Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);


        public static IEnumerable<TokenEntity> GetLambdaCalcTokens(this string exp)
        {
            Token[] tokens = Enum.GetValues(typeof(Token)).OfType<Token>().ToArray();
            foreach (Match m in MathRegex.Matches(exp))
            {

                foreach (Token token in tokens)
                {
                    if (m.Groups[token.ToString()].Success)
                    {
                        yield return new TokenEntity(
                            token,
                            m.Index,
                            m.Value);
                    }
                }
            }

            yield return new TokenEntity(Token.lexical_error, exp.Length, "\0");
            yield return new TokenEntity( Token.relop, exp.Length, "\0");
            yield return new TokenEntity(Token.delim, exp.Length, "\0");
            yield return new TokenEntity(Token.sign, exp.Length, "\0");
        }
    }
    internal class TokenEntity
    {
        public TokenEntity(Token token, int startPos, string value)
        {
            this.Token = token;
            this.StartPos = startPos;
            this.Value = value;
        }


        public Token Token { get; private set; }


        public int StartPos { get; private set; }


        public string Value { get; private set; }

        public override string ToString()
        {

            return string.Format(Value.PadRight(13) + "\t\t" + Token);

        }
    }
}

حاولت ادخل الكي وورد مثلا لو دخل المستخدم

iijd,drome nth then kdjdg

يطلع له البرنامج ان سلسلة الحروف then هي كلمة محجوزة key word

طبعا كل الكلمات المحجوز them else if ...ألخ

جربته بكلمة if طلع لي

i-> key word

f ->keyword

وحاجة ثانيه ما ضبطت معايا مثلا 12345.234E45

يعتبر رقم كامل

حاولت اضبطه ما ضبط ما ادري لي

وح‘ـده من البنات قالت استخدمي To char array

خزني فيها بعدين سوي المقارنات وماعرفت استخدمها لوعندي مثال انه يستخدم هالداله

ياليت تحطه لي عشان افهمها سواء استخدمها بهالمشروع او غيره

"اللي ابي اعرفه من هذي الداله كيف تخزن اللي بالtextbox وبعدها اعمل مقارنات عليها وارجع اخزن النتائج واعرضها ب textbox ثاني

دوختكم معليش :"(

تم تعديل هذه المشاركة بواسطة Ms.Nada في 28 أبريل 2010 في 15:04

#20

عشان تحطين البيانات من مربع نص إلى متغير تستخدمين هاذي الطريقة:

نفترض ان مربع النص اسمه textbox1

string text = textbox1.Text ;

118650.jpg
#21

وبالنسبة للأخطاء انا ماطلعت معي .. دخلت 12345.234E45

يقسمه جزئين الأول : 12345.234 الي هو رقم

والثاني : E45 يعتبره كلمة ..؟

وشي المشكله بالظبط..؟

118650.jpg
#22

هلا خيو ^^

المشكلة أنو 12345.234E45

يعتبر رقم كامل "رقم اسي"

بجرب الطريقة اللي قلت عنها "عن التكست بوكس"

تسلم خيو تعبتك معاي ^^

#23

أختى الكريمه هذا تحويل كود C++ الذى وضعتيه الى C#

ولكن به بعض الأخطاء فى ال Debugging حاولى التعديل فيه

وان كان عندى وقت سأحاول حلها ان شاء الله

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsTest5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public static int forword = -1;
        public static int lexeme_beginning = -1;
        public static int state = 0;
        public static int start = 0;
        public static int source_code_length = 0;
        public static string source_code = new string(new char[1000]);
        public static char current_char;
        public static string lexeme;
        public static string token;


        public static void get_source_code(string s)
        {
            for (int i = 0; i < 1000; i++)
            {

                source_code = s;
                if (source_code == '\n')
                {
                    break;
                }

                source_code_length++;

                if (source_code == '\b')
                {
                    Console.Write(' ');
                    Console.Write('\b');
                    if (i == 0)
                    {
                        i--;
                        source_code_length--;
                    }
                    else
                    {
                        i -= 2;
                        source_code_length -= 2;
                    }
                }

                else if (source_code == '\r')
                {
                    Console.Write("\n");
                    if (source_code[i - 1] == '$')
                    {
                        source_code_length -= 2;
                        break;
                    }
                }
            }
        }

        public static char nextchar()
        {
            return source_code[++forword];
        }

        public static bool isletter(char c)
        {
            int ascii = c;

            if ((ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122))
                return true;
            else
                return false;
        }

        public static bool isdigit(char c)
        {
            int ascii = c;
            if (ascii >= 48 && ascii <= 57)
                return true;
            else
                return false;
        }

        public static int fail()
        {
            forword = lexeme_beginning;
            switch (start)
            {
                case 0:
                    start = 9;
                    break;
                case 9:
                    start = 12;
                    break;
                case 12:
                    start = 20;
                    break;
                case 20:
                    start = 25;
                    break;
                case 25:
                    recover();
                    break;
            }
            return start;
        }

        public static void retract(int a)
        {
            forword -= a;
        }

        public static void install_id()
        {
            lexeme = "";
            for (int i = lexeme_beginning + 1; i <= forword; i++)
                lexeme += source_code;


        }

        public static void install_num()
        {
            lexeme = "";
            for (int i = lexeme_beginning + 1; i <= forword; i++)
                lexeme += source_code;
        }

        public static string gettoken()
        {
            if (lexeme == "if" || lexeme == "then" || lexeme == "else")
                return (lexeme + "\t\tKEYWORD");
            else
                return (lexeme + "\t\tIDENTIFIER");
        }

        public static void recover()
        {
            if (forword == source_code_length - 1)
            {
                Console.Write("\n");
                Console.Write("Compilation is finished");
                Console.Write("\n");
                Console.Write("\n");
                //exit(0);
            }
            else
                start = -1;
        }

        public static string nexttoken()
        {
            //while (1)
            //{
            switch (state)
            {
                case 0:
                    current_char = nextchar();

                    if (current_char == '\t' || current_char == '\r' || current_char == ' ')
                    {
                        lexeme_beginning = forword;
                        state = 0;
                        start = 0;
                    }
                    else if (current_char == '<')
                        state = 1;
                    else if (current_char == '=')
                        state = 5;
                    else if (current_char == '>')
                        state = 6;
                    else
                        state = fail();
                    return ("");
                    break;
                case 1:
                    current_char = nextchar();

                    if (current_char == '=')
                        state = 2;
                    else if (current_char == '>')
                        state = 3;
                    else
                        state = 4;
                    return ("");
                    break;
                case 2:
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return ("<=\t\tRO (LE)");
                    break;
                case 3:
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return ("<>\t\tRO (NE)");
                    break;
                case 4:
                    retract(1);
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return ("<\t\tRO (LT)");
                    break;
                case 5:
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return ("=\t\tRO (EQ)");
                    break;
                case 6:
                    current_char = nextchar();
                    if (current_char == '=')
                        state = 7;
                    else
                        state = 8;
                    return ("");
                    break;
                case 7:
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (">=\t\tRO (GE)");
                    break;
                case 8:
                    retract(1);
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (">\t\tRO (GT)");
                    break;
                case 9:
                    current_char = nextchar();
                    if (isletter(current_char))
                        state = 10;
                    else
                        state = fail();
                    return ("");
                    break;
                case 10:
                    current_char = nextchar();
                    if (isletter(current_char))
                        state = 10;
                    else if (isdigit(current_char))
                        state = 10;
                    else
                        state = 11;
                    return ("");
                    break;
                case 11:
                    retract(1);
                    install_id();
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (gettoken());
                    break;
                case 12:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 13;
                    else
                        state = fail();
                    return ("");
                    break;
                case 13:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 13;
                    else if (current_char == '.')
                        state = 14;
                    else if (current_char == 'E' || current_char == 'e')
                        state = 16;
                    else
                        state = fail();
                    return ("");
                    break;
                case 14:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 15;
                    else
                        state = fail();
                    return ("");
                    break;
                case 15:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 15;
                    else if (current_char == 'E' || current_char == 'e')
                        state = 16;
                    else
                        state = fail();
                    return ("");
                    break;
                case 16:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 18;
                    else if (current_char == '+' || current_char == '-')
                        state = 17;
                    else
                        state = fail();
                    return ("");
                    break;
                case 17:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 18;
                    else
                        state = fail();
                    return ("");
                    break;
                case 18:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 18;
                    else
                        state = 19;
                    return ("");
                    break;
                case 19:
                    retract(1);
                    install_num();
                    lexeme_beginning = forword;
                    start = 0;
                    state = 0;
                    return (lexeme + "\t\tNUMBER");
                    break;
                case 20:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 21;
                    else
                        state = fail();
                    return ("");
                    break;
                case 21:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 21;
                    else if (current_char == '.')
                        state = 22;
                    else
                        state = fail();
                    return ("");
                    break;
                case 22:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 23;
                    else
                        state = fail();
                    return ("");
                    break;
                case 23:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 23;
                    else
                        state = 24;
                    return ("");
                    break;
                case 24:
                    retract(1);
                    install_num();
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (lexeme + "\t\tNUMBER");
                    break;
                case 25:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 26;
                    else
                        state = fail();
                    return ("");
                    break;
                case 26:
                    current_char = nextchar();
                    if (isdigit(current_char))
                        state = 26;
                    else
                        state = 27;
                    return ("");
                    break;
                case 27:
                    retract(1);
                    install_num();
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (lexeme + "\t\tNUMBER");
                    break;
                default:
                    lexeme = nextchar().ToString();
                    lexeme_beginning = forword;
                    state = 0;
                    start = 0;
                    return (lexeme + "\t\tLEXICAL ERROR");
                    break;
            }
        }
        //}

        //public static void Main()
        //{
            //test t = new test();
            //Console.Write("type your code here :");
            //Console.Write("\n");
            //Console.Write("\n");
            //Console.ReadLine();
            //char c = Console.ReadKey().KeyChar;
            //get_source_code();

            //Console.Write("\n");
            //Console.Write("\n");

            //Console.Write("LEXEME\t\tTOKEN");
            //Console.Write("\n");
            //Console.Write("======\t\t=====");
            //Console.Write("\n");

            //while (forword < source_code_length - 1)
            //{
            //    token = nexttoken();
            //    Console.Write(token);
            //    Console.Write("\n");
            //}
        //}

        private void button1_Click(object sender, EventArgs e)
        {

            txtResult.Text = "LEXEME                             Token                    ";
            string st = codetext.Text;
            get_source_code(st);


            while (forword < source_code_length - 1)
            {
                token = nexttoken();
                txtResult.Text += token + "                                              ";
            }
        }
    }
}
1

 وممّا زادنـــي شرفــاً وتيهــاً   **  وكدت بأخمصي أطأ الثريّا

دخولي تحت قولك يا عبادي  **   وأن صيّرت أحمد لي نبيّـاً

#24

عمرو ..~

تسلم خيو ..

إن شاء الله بحاول فيه

واشوف حل الاخطاء ^^

#25

تعديل بسيط جداً على الكود الي وضعته سابقاً :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace LCalc
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textbox1.Text = "LEXEME                             Token" + Environment.NewLine;
            string st = codetext.Text;
            foreach (TokenEntity t in st.GetLambdaCalcTokens())
            {
                textbox1.Text += t + Environment.NewLine;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }



    internal enum Token
    {
        OpenParan, CloseParan,
        Arrow,
        Comma,
        Period,
        Plus, Minus, Multiply, Divide,
        Number,
        Identifier,
        Other       // Represents unrecognized charachters
    }
    internal static class LambdaCalcScanner
    {
        // The pattern used with the regular expression class to scan the input
        const string Pattern = @"
                        (?'OpenParan' \( ) | (?'CloseParan' \) ) |
                        (?'Arrow' => ) |
                        (?'Comma' ,  ) |
                        (?'Period' \.  ) |
                        (?'Plus' \+ ) | (?'Minus' - ) | (?'Multiply' \* ) | (?'Divide' / ) |
                        (?'Number' (\.\d+|\d+(\.\d+)?) ) |
                        (?'Identifier' [a-zA-Z]\w* ) |
                        (?'Other' [^ \r\n\t])";

        // Regular expression used to scan the input
        private static Regex MathRegex = new Regex(Pattern, RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);

        // Enumurable to get tokens from the given expression (scanner)
        public static IEnumerable<TokenEntity> GetLambdaCalcTokens(this string exp)
        {
            Token[] tokens = Enum.GetValues(typeof(Token)).OfType<Token>().ToArray();
            foreach (Match m in MathRegex.Matches(exp))
            {
                // Check which token is matched by this match object
                foreach (Token token in tokens)
                {
                    if (m.Groups[token.ToString()].Success)
                    {
                        yield return new TokenEntity(
                            token,
                            m.Index,
                            m.Value);
                    }
                }
            }
            // return the end string token, to indecate we are done
            yield return new TokenEntity(Token.Other, exp.Length, "\0");
        }
    }
    internal class TokenEntity
    {
        public TokenEntity(Token token, int startPos, string value)
        {
            this.Token = token;
            this.StartPos = startPos;
            this.Value = value;
        }

        // Token type
        public Token Token { get; private set; }

        // Start position in the original string
        public int StartPos { get; private set; }

        // Value
        public string Value { get; private set; }

        public override string ToString()
        {

            return string.Format(Value.PadRight(13) + "                    " + Token);

        }
    }
}

نسيت وضع كود لإنشاء سطر جديد مفيد لترتيب النتايج ..:)

Environment.NewLine

تم تعديل هذه المشاركة بواسطة azooz-tamimi في 30 أبريل 2010 في 20:11

1
118650.jpg

مواضيع مشابهة