Pegjs: منتدى أم دردشة؟ تمرير القيم إلى أسفل / ظهور القيم؟

تم إنشاؤها على ٢٣ مارس ٢٠١٧  ·  7تعليقات  ·  مصدر: pegjs/pegjs

pegjs بسيطة وقوية. أحبها! لدي بعض الأسئلة التي لم يتم تناولها في المستندات:

أنا أقوم بتحليل هذا ، وهو أمر ناجح ، لكن القاعدة تبدو محرجة:

f = x => x * x

إذا فوضته ليقول عامل التشغيل ، فلا توجد طريقة لتمرير القيم إلى أسفل. إذا قمت بإنشاء ValuesOperators أو = و => ، فسيكون ذلك أكثر وضوحًا بعض الشيء ، ولكن في المستوى الأعلى ما زلت بحاجة إلى التحقق من أيهما كان. في مثال JavaScript ، أرى استخدام {type: "Literal" ، القيمة: ...}. هل هذه هي أفضل طريقة لتمرير المعلومات احتياطيًا؟

  = values:Values body:(_ "=>" _ Expression)? assign:(_ "=" _ Expression)? {
      if (body && body.length > 0) {
        return new Function(values, body[3]);
      } else if (assign) {
        return new Assignment(values, assign[3]);
      } else {
        return values;
      }
    }

شكرا!
مايك

التعليق الأكثر فائدة

كنت أفترض أنه لا يوجد تراجع وكونك جشعًا يعني أنه يتعين عليك العمل مع "أينما كنت حاليًا" ، لكن هذا ليس هو الحال. ياي!

الجشع يعني فقط أنه إذا وجد تطابقًا فسوف يأخذها ، أليس كذلك؟ ولكن إذا لم تتطابق القاعدة بأكملها ، فستبدأ مرة أخرى من البداية في المباراة التالية. هذا يجعل الأمر أسهل بكثير مما كنت أحاول القيام به لأول مرة.

x, y = 2 + 3.foo + "foo", 5 * 2

هذا سهل إلى حد ما عندما يمكن مطابقة الواجب بشكل منفصل عن التعبير العادي ، وما إلى ذلك.

  = Assignment
  / Expression

Assignment
  = vars:Variables _ "=" _ expr:Expression

Variables
  = head:Identifier tail:(_ "," _ Identifier)*

...

ال 7 كومينتر

في القواعد النحوية من الضروري فهم القواعد. وأنت تقدم فقط من الباطن .. هذا ليس واضحا بالنسبة لي ، كيف يمكن أن يكون واضحا للآلة؟
من الصعب جدًا كتابة قواعد LALR ولكن أسهل من LR وأسهل من LL ..
قواعد PEG سهلة الكتابة برعم الأكثر صعوبة في الكتابة بكفاءة.
هل أنت متأكد من أنك تستخدم اللعبة الصحيحة؟ إذا كان لديك قواعد لغة PEG جيدة ، فيجب أن تكون قادرًا على إنشاء مترجم أو تفسير بسهولة مثل تفسير القواعد الخاصة بك.

هل تعرف الملاكمة / unboxing في الأجهزة الافتراضية؟

كيف يمكنك الحصول على values في الجانب الأيسر من المهمة؟ لأن لديك هذا: body:(_ "=>" _ Expression)? انتهى بـ ؟

ما معنى values في قواعدك؟ هل تعرف ما هي قيمة L ؟

يجب أن تحافظ على قواعدك اللغوية قريبة. يكون الأمر صعبًا مع PEG في بعض الحالات .. { type: "Literal", value: ... } هو بالضبط ما تحتاجه في AST. انظر إلى http://astexplorer.net/ كيف يمكن أن يبدو

لقد بدأت للتو في استخدامه للتجربة ، لذا نعم ، بعض التسمية غير صحيحة :) لقد كتبت بعض موزعي LL (1) البسيط ، لكن مر وقت طويل. أشعر بالفضول فقط ما هي أفضل طريقة للتعامل مع القرارات. سأبسط بناء الجملة هذا:

أ = ب
أو
س => س * س

هل من الأنسب أن تفعل شيئًا كهذا؟

التعيين أو الوظيفة
= معرف : عامل تشغيل المعرف : IdentOperator {
إذا كان (نوع التشغيل === "الوظيفة") {
...
}

معرف المشغل
= "="! ">" {return {type: "Assignment"؛ }}
/ "=>" {...}

لمعلوماتك ، كانت "القيم" مصطلحًا استخدمته ليعني قائمة العناصر - ستكون قيمًا إذا تم استخدامها كمجموعة ، ولكن المتغيرات إذا تم استخدامها لتحديد وسيطات الوظيفة. على سبيل المثال (2 + 3).

شكرا على وقتك!

mikeaustin هو لك :-)

كتابة القواعد النحوية هي كل شيء عن التخفيضات . الأكثر هو البيان . إنه مثل Sentense ، كما تعلم ، لديك LL قواعد النحو :-)

تقع على عاتقك مسؤولية تحديد القواعد بالمعنى (آسف لدي مشكلة في اللغة الإنجليزية: - D في بعض الأحيان)

كيف تريد عملية AssignmentOrFunction؟ هذا هو نفس العبارة في العديد من اللغات ، ولكن يمكن أن تكون قيمة R أيضًا.
على الجانب الآخر

    = "=" !">" { return { type: "Assignment"; } }
    / "=>" { ... }

يمكن كتابتها بشكل أفضل

    = "=>" { ... }
    / "=" { return { type: "Assignment"; } }

قد أكون مخطئا .. ولكن هذا يبدو أنك كسرت الجملة في جزء ليس بهذه الأهمية. بدون سياق ليس من المهم حقًا ما تقيمه ..

من الصعب حقًا كتابة PEGs لأنه يمكنك بسهولة كتابة قواعد لا يمكن الوصول إليها أو يمكنك كتابة قواعد من شأنها سرقة الجملة وتقييمها بشكل غير صحيح ، لذلك إذا كنت مبتدئًا ، فيجب أن يكون لديك جمل على اليسار و ASTs مطلوبة على اليمين طوال الوقت ، عشرة مرات أكثر من الاختبارات الآلية ثم القواعد النحوية. صدقني ، أنت تغير قاعدة واحدة وسوف ينكسر المحلل اللغوي بأكمله ..

وبالطبع يجب أن تلعب به ، اكتب شيئًا ما ، مرارًا وتكرارًا .. ليس من التافه كتابة آلة حاسبة للتعبير الفعال باستخدام PEG ، لاحظ عدة مستويات للأسبقية .. PEG أفضل للتحليل العام.

لا تعطيني مزيدًا من السياق في سؤالك ، لذلك من الصعب جدًا تخمين ما تريد حقًا بناءه ولكن يمكنني أن أخمن أنه يجب عليك اللعب أكثر مع القواعد النحوية ، فهناك AntLR ، أداة رائعة للتعلم ، GoldParser (LALR) (بلدي اللعبة الأولى :-)) ، بعض موزعي المدارس القديمة الذين تم اختبارهم جيدًا ، والأكثر كفاءة ولكنهم مقسمون إلى رمز / محلل (lex و yacc الأقدم ، فليكس و بيسون الأحدث) ، والعديد من المنافذ ..

يبدو PEG مثل أبسط. هو حقا. لكنها ستكون دائما الأكثر خطورة ...

شكرا جزيلا! أوه ، لقد وجدت مجموعة Google لـ pegjs ، لكنني لم ألاحظها لأنها كانت في قسم التطوير. إذا كانت لدي أسئلة أخرى ، فسأذهب بالتأكيد إلى هناك بدلاً من ذلك.

نعم ، التعيين "x = y" هو _statement_ ، ولكن "x => x * x" يمكن أن يكون جزءًا من _expression_ ، وكذلك "x == y" ، إلخ. "=" هي حالة خاصة ، وهكذا هي "=>" بمعنى أنها ليست عوامل تشغيل منتظمة. سوف أتدرب أكثر ، وألقي نظرة عن كثب على الأمثلة. أتمنى لو كانت هناك أمثلة أكبر من الآلة الحاسبة ، لكنها أصغر من الأمثلة الأخرى. ربما إذا أحرزت تقدمًا فيمكن أن يكون مثالاً :)

بالنسبة لمشروعي ، أود كتابة لغة بسيطة لنقلها إلى JS. الأساسيات هي طرق خارجية ذات نطاق معجمي (لا يوجد ترقيع للقرود ، مثل Dylan أو CLOS ولكن بدون طرق متعددة) ، وسيطات الكلمات الرئيسية ، و ADTs ، وربما حتى الكتابة الثابتة الاختيارية. تعني كلمة "بسيط" أن كل شيء يعمل معًا ، وهناك طريقة واحدة فقط للقيام بشيء ما. يمكن أن يكون صنع شيء بسيط أمرًا صعبًا.

أيضًا ، هناك مكتبات مثل adt والطرق المتعددة التي يمكن أن تستفيد من بناء الجملة الأصلي. يمكن تحقيق ذلك في الواقع باستخدام حلو ، لكن الحلو يمكن فقط توسيع JS ، وليس جعله أبسط. يحتوي TypeScript على خيارات مثل "--strictNullChecks" ويدعم أنواع الاتحاد المضمنة ، ولكن مرة أخرى ، يقوم بتوسيع JS بحيث يترك كل الأشياء السيئة هناك (الإكراه الضمني ، "+" لسلسلة السلسلة ، ورفع النطاق ، وما إلى ذلك).

مرة أخرى ، شكرا على كل المساعدة!
مايك

كنت أفترض أنه لا يوجد تراجع وكونك جشعًا يعني أنه يتعين عليك العمل مع "أينما كنت حاليًا" ، لكن هذا ليس هو الحال. ياي!

الجشع يعني فقط أنه إذا وجد تطابقًا فسوف يأخذها ، أليس كذلك؟ ولكن إذا لم تتطابق القاعدة بأكملها ، فستبدأ مرة أخرى من البداية في المباراة التالية. هذا يجعل الأمر أسهل بكثير مما كنت أحاول القيام به لأول مرة.

x, y = 2 + 3.foo + "foo", 5 * 2

هذا سهل إلى حد ما عندما يمكن مطابقة الواجب بشكل منفصل عن التعبير العادي ، وما إلى ذلك.

  = Assignment
  / Expression

Assignment
  = vars:Variables _ "=" _ expr:Expression

Variables
  = head:Identifier tail:(_ "," _ Identifier)*

...

أمرت mikeaustin PEGs بالاختيار مما يعني أن النمط الأول الذي يطابق في تعبير ما سيتطابق تلقائيًا. يعد مثال => على = . قد ترغب في التفكير أكثر في ما يمكن أن يكون عليه التعبير من حيث "أحد هذه الأشياء" بدلاً من "الاستيلاء على كل هذا النص الذي يمكن أن يكون تعبيرًا واكتشافه لاحقًا"

  = FunctionExpression
  / Assignment
  / Value

لإثبات أنني أنشأت اختبارًا لقواعد اللغة يمكنك اللعب به. إنه صاخب بعض الشيء لكنني حاولت أن أبقيه بسيطًا جدًا ، مع تجاهل بعض الأشياء مثل السماح بمسافات بيضاء إضافية وعوامل تشغيل. لاحظ الكتلة Expression حيث يحدث السحر. أيضًا ، لقد استخدمت أشياء مثل SubExpression و ExpressionList كطرق للتعامل مع مواقف "العديد من هذه" ؛ يعمل هذا النمط جيدًا بالنسبة لي مع الاحتفاظ بفواصل القوائم والعناصر منفصلة.

في كل حالة أحاول أن أبقي القواعد بسيطة من خلال وجود عنصر واحد لكل نوع من المطابقة. هناك بعض التكرار المتضمن لأنه يمكنني إعادة كتابته بحيث يكون لدينا تسلسل واحد كبير للمطابقة مع كل التركيبات الممكنة ، لكن من الصعب متابعتها وتفسيرها وتترك الغموض المفتوح الذي يمكن لـ PEGs القضاء عليه بالاختيار المرتب. آمل أن يساعد.

سألقي نظرة على اختبار القواعد ، شكرًا! من المفيد رؤية مجموعة فرعية صغيرة من اللغة نظرًا لأن قواعد JavaScript كبيرة جدًا.

dmsnell لقد تعلمت الكثير مؤخرًا عن طريق إزالة القواعد وإضافة بعض القواعد الجديدة لقواعد JavaScript ، يمكنك الاطلاع على الأحدث هنا: impulse.pegjs . لقد أزلت صيغة elision [،] ، وبعض العوامل ، وتعبيرات التسلسل ، وما إلى ذلك ، وأضفت بناء جملة tuple (1 ، 2) وبناء جملة النطاق 1..5. تتطلب أرقام الفاصلة العائمة علامة عشرية على كلا الجانبين لتسهيل تحليل النطاقات الحرفية.

لقد كنت أعمل على الكثير من وقت التشغيل مؤخرًا ، لكنني أرغب في العودة إلى المحلل اللغوي لإصدار JavaScript بالفعل. أنا بين الوظائف لذلك لدي القليل من الوقت بين يدي :) بعض الأفكار لهجة نظيفة من جافا سكريبت مع طرق الامتداد ، والمعلمات المسماة ، والسمات والخلطات ، وتحميل المشغل الزائد ، والصفوف الحرفية وبناء جملة النطاق.

شكرا لك مرة أخرى!
مايك

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات