-
-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🦸 [Need Help] Operator-precedence parser 🦸 #71
Comments
here is cpp's operator precedence https://en.cppreference.com/w/cpp/language/operator_precedence im pretty sure its common sense using bidmas i can help if need be. |
Thank you for your message. Okay, honestly I not sure about some special operators. such as >> << and etc. |
I checked its parser. They did not divide the phrase into several groups. |
Dear @snapogod; Can you help us complete the BNF grammar? https://github.com/One-Language/One/blob/master/grammar.BNF |
Another nice implementation of the expression parser. But it does not help us much. int get_op_precedence(char op)
{
int res = 0;
if (op == '+' || op == '-')
{
res = 9;
}
else if (op == '*' || op == '/' || op == '%')
{
res = 10;
}
else if (op == '^')
{
res = 11;
}
return res;
}
static int is_higher_or_equal_precedence(char op1, char op2)
{
return get_op_precedence(op1) >= get_op_precedence(op2);
}
static int is_higher_precedence(char op1, char op2)
{
return get_op_precedence(op1) > get_op_precedence(op2);
}
static int is_left_assoc_operator(char op)
{
return (op == '+' || op == '-' || op == '*' || op == '/' || op == '%');
}
static int is_right_assoc_operator(char op)
{
return (op == '^');
} |
Some useful references I find yesterday: |
Another nice implementation of the expression parser: This is something I extracted from the above code but it is still incomplete and has a problem:
|
I found some online tools that can test grammar. More about this subject:
But I'm looking for something that can draw a picture and show it with a figure ... Do you know anything? |
Another nice example from
|
The above codes are summarized as follows:
The problem is that this grammar is not complete and does not include dozens of operators! |
A tiny YACC/Bison example:
|
Okay, so again we need "Precedence of operators in BNF grammar" with all operators not only + - * /. |
And finally, I find BNF of c language: And also another nice documentation for BNF: |
Currently + - operators supported. But we need to add many more operators. A question, The input is
It's correct? can someone check this? |
A message from Dear snappyagggodypingable:
all those right? |
ruby:
And again message from Dear snappyagggodypingable:
|
Hooray, It's mostly done and now works. 👍 |
A = (2 + 15 * ( 25 - 13 ) / 1 - 4) + 10 / 2 AST TREE of The above mathematic expression:
I'm not sure it's correct or no. |
Correct answer is:
|
Below is the full implementation of EvaluateExpression function and its helpers in C#.
|
Great work @BaseMax !! 🥇 |
_ (2 + 15 * ( 25 - 13 ) / 1 - 4) + 10 / 2 Tree Output of the expression:
I not sure it's correct or no. |
That was wrong. I fixed bug 4c07353. and finally it's AST output:
|
Sorry, I don't have much time to translate this to English:
سلام شب همگی بخیر؛
سوالی داشتم لطفا راهنمایی ام کنید.
اینکه یک اپراتور چپ به راست هست یا راست به چپ چه مفهومی داره؟
مثلا جمع و تفریق بنظر چپ به راست هست. اما مساوی راست به چپ هست. یکسری مثال خوب و شفاف پیدا کردم میفرستم شاید بدرد شما هم بخوره. Example: 5 - 4 - 3 Example: x = y = z این دقیقا بحث operator associativity هست که نمیدونم فارسی اش چیه: https://en.wikipedia.org/wiki/Operator_associativity سلام. چون بنظر عملگر ضرب و تقسیم هر دو چپ به راست هستند. : اول اینکه جمع و تفریق چپ به راست هست. 105 / 10 * 10 = 10/2 * 5 -1 10.5 * 10 = 10/2 * 5 -1 105 = 5 * 5 -1 توی این تحلیل من اصلا هیچ موردی توی ذهنم رو برای عملگر مساوی رعایت نکردم چون عملگر مساوی راست به چپ هست اما تغییری برام ایجاد نکرد یا حداقل بلد نیستم چه تغییری ایجاد کرده که نفهمیدم. These thoughts were in my mind. |
یه چیزی یاد گرفتم گفتم اینجا هم بگم شاید برای برخی هم سوال باشه.
چپ به راست بودن یا راست به چپ بودن عملگر تنها در شرایطی مهم میشه که حداقل دو تا عملگر هم جنس یا تکراری داشته باشیم.
در شرایطی که یک عملگر باشه هیچ فرقی نمیکنه که از چپ شروع بشه یا از راست.
x = y = z
عبارت ریاضی: دو تحلیل مختلف که میشود داشت:
یکی از چپ:
(x = y) = z
اینجا چون حداقل دو تا عملگر = داشتیم این مهم شد که کدوم تحلیل درسته. اما اگه فقط یدونه = میداشتیم اصلا این نیاز حس نمیشد.
!+-X
اها. الان بیشتر متوجه میشوم. مثلا اگه همچین عبارتی داشته باشیم:
این رو چطور تحلیل کنیم؟
اینجا بیشتر از یک اپراتور از یک جنس داریم.
طبیعتا دو نوع تحلیل میشه داشت.
تحلیل از راست به چپ:
! ( + ( -(X) ) )
تحلیل از چپ به راست:
نمیدونم چطوری میشه. گیج شدم باز.
خب مشخص هست که هنوز نفهمیدم چون گیر میکنم. |
========= نیم ساعت بعد =========
5 * !+-X / 2
سعی کردم یه عبارت ریاضی سخت تر و پیچیده بسازم:
خب روی همین عبارت گیر کردم. سوالی که برای ادم پیش میاد این هست که الان
منفی ایکس رو تقسیم بر دو بکنم و بعد ادامه بده یا اینکه نه همه رو حساب بکنه اخر سر تقسیم بر دو بکنه.
با اینکه گیج میزنم سعی میکنم دامه بدهم ببینم به چی و چه مرحله ای میرسم:
5 * !(+(-(x))) / 2
این یکی از حالت ها هست. حالت دیگه هم احتمالا این بشه:
5 * !(+(-(x / 2) ) )
|
Hey @BaseMax what is the status of this issue ? |
It's fixed in new version, I have to push new version and focus on the core. |
Do you have an update on this ? Is core ready in the new branch ? |
A new update: almost every operator work well in the new version. We are on a roll! |
Hi, I took the initial phase of the parser forward and it works well and detects tokens.
Now I need help arranging operations and operators. Does anyone want to help? (Operator-precedence parser)
for e.g:
The text was updated successfully, but these errors were encountered: