أحتاج إلى مساعدة في ترجمة هذا الجزء من قواعد ECMASCRIPT؟
-
30-09-2019 - |
سؤال
لقد كنت أعمل على تنفيذ ECMASCript لبعض الوقت الآن. لقد فعلت كل شيء باليد للمساعدة في الحصول على فهم عميق للعملية. لقد فشلت المحاولات المتكررة لتحليل وفهم هذا الجزء من القواعد ، لذا فقد كنت أعمل على أجزاء أخرى من المشروع ، لكنني الآن في مرحلة ما كنت أعمل على حرفية كائن ، لذا أحتاج حقًا إلى تلميع محلل النحيل الخاص بي. هل يمكن لأي شخص أن يضع هذا من حيث المبتدئ في اللغة المحلل اللغوي يمكن أن يفهمه؟
أكبر مصدر للارتباك هو ما يلي:
حجج memberexpression جديدة
من المفترض أن يكون هذا تعبيرًا عضويًا ، لكن هذا يبدو على ما يلي:
NewExpression : MemberExpression new NewExpression
هل التعبير الجديد تعبير عضو أو تعبير جانبي يسار؟ لأكون صادقًا ، أواجه مشكلة في وضع فئات C# المناسبة للقواعد الخرسانية.
MemberExpression : PrimaryExpression FunctionExpression MemberExpression [ Expression ] MemberExpression . IdentifierName new MemberExpression Arguments NewExpression : MemberExpression new NewExpression CallExpression : MemberExpression Arguments CallExpression Arguments CallExpression [ Expression ] CallExpression . IdentifierName LeftHandSideExpression : NewExpression CallExpression
هذا هو تصميم الفصل الذي كنت أعمل معه ، لكن مع استمرار دراسة المواصفات لن تختفي الشكوك.
public abstract class LeftHandSideExpression : ConcreteExpression
{
}
public sealed class NewExpression : LeftHandSideExpression
{
public NewExpression(MemberExpression memberExpression, Arguments arguments)
{
}
public NewExpression(NewExpression newExpression, Arguments arguments)
{
}
}
public sealed class CallExpression : LeftHandSideExpression
{
public CallExpression(MemberExpression memberExpression, Arguments arguments)
{
}
public CallExpression(CallExpression callExpression, Arguments arguments)
{
}
}
public sealed class MemberExpression : ConcreteExpression
{
public MemberExpression(PrimaryExpression primaryExpression)
{
}
public MemberExpression(PrimaryExpression primaryExpression, string identifierName)
{
}
public MemberExpression(PrimaryExpression primaryExpression, ConcreteExpression indexerExpression)
{
}
public MemberExpression(FunctionExpression functionExpression)
{
}
public MemberExpression(FunctionExpression functionExpression, string identifierName)
{
}
public MemberExpression(FunctionExpression functionExpression, ConcreteExpression indexerExpression)
{
}
}
بناءً على إجابة آندي ، توصلت إلى تصميم جديد منطقي.
public abstract class LeftHandSideExpression : ConcreteExpression
{
public ConcreteExpression Expression { get; private set; }
protected LeftHandSideExpression(ConcreteExpression expression)
{
Expression = expression;
}
}
public class NewExpression : LeftHandSideExpression
{
public Arguments Arguments { get; private set; }
protected NewExpression(PrimaryExpression primaryExpression)
: base(primaryExpression)
{
}
protected NewExpression(FunctionExpression functionExpression)
: base(functionExpression)
{
}
protected NewExpression(MemberExpression memberExpression)
: base(memberExpression)
{
}
protected NewExpression(CallExpression callExpression)
: base(callExpression)
{
}
public NewExpression(MemberExpression memberExpression, Arguments arguments)
: base(memberExpression)
{
Arguments = arguments;
}
public NewExpression(NewExpression newExpression, Arguments arguments)
: base(newExpression)
{
Arguments = arguments;
}
}
public sealed class CallExpression : LeftHandSideExpression
{
public Arguments Arguments { get; private set; }
public CallExpression(MemberExpression memberExpression, Arguments arguments)
: base(memberExpression)
{
Arguments = arguments;
}
public CallExpression(CallExpression callExpression, Arguments arguments)
: base(callExpression)
{
Arguments = arguments;
}
}
public class MemberExpression : NewExpression
{
public MemberExpression(PrimaryExpression primaryExpression)
: base(primaryExpression)
{
}
public MemberExpression(FunctionExpression functionExpression)
: base(functionExpression)
{
}
public MemberExpression(MemberExpression memberExpression)
: base(memberExpression)
{
}
protected MemberExpression(CallExpression callExpression)
: base(callExpression)
{
}
}
public sealed class DotPropertyAccessExpression : MemberExpression
{
public string IdentifierName { get; private set; }
public DotPropertyAccessExpression(PrimaryExpression primaryExpression, string identifierName)
: base(primaryExpression)
{
IdentifierName = identifierName;
}
public DotPropertyAccessExpression(FunctionExpression functionExpression, string identifierName)
: base(functionExpression)
{
IdentifierName = identifierName;
}
public DotPropertyAccessExpression(MemberExpression memberExpression, string identifierName)
: base(memberExpression)
{
IdentifierName = identifierName;
}
public DotPropertyAccessExpression(CallExpression callExpression, string identifierName)
: base(callExpression)
{
IdentifierName = identifierName;
}
}
public sealed class BracketPropertyAccessExpression : MemberExpression
{
public ConcreteExpression IndexerExpression { get; private set; }
public BracketPropertyAccessExpression(PrimaryExpression primaryExpression, ConcreteExpression indexerExpression)
: base(primaryExpression)
{
IndexerExpression = indexerExpression;
}
public BracketPropertyAccessExpression(FunctionExpression functionExpression, ConcreteExpression indexerExpression)
: base(functionExpression)
{
IndexerExpression = indexerExpression;
}
public BracketPropertyAccessExpression(MemberExpression memberExpression, ConcreteExpression indexerExpression)
: base(memberExpression)
{
IndexerExpression = indexerExpression;
}
public BracketPropertyAccessExpression(CallExpression callExpression, ConcreteExpression indexerExpression)
: base(callExpression)
{
IndexerExpression = indexerExpression;
}
}
المحلول
إليك طريقة مختلفة لتصورها. هذه هي الطريقة التي أرى بها التسلسل الهرمي العام للإنتاج في القسم 11.2:
LeftHandSideExpression :
NewExpression :
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
new NewExpression
CallExpression :
MemberExpression Arguments
CallExpression Arguments
CallExpression [ Expression ]
CallExpression . IdentifierName
يبدو أن Memberexpressions هي جديدة ، والتي بدورها ، تعتبر اليسار. آمل أن يساعد هذا.