3

私はかなり前からECMAScriptの独自の実装に取り​​組んできました。私は基本的にすべてを手作業で行い、プロセスを深く理解できるようにしています。文法のこの部分を分析して理解するための繰り返しの試みは失敗したので、私はプロジェクトの他の部分に取り組んできましたが、今はオブジェクトリテラルに取り組んでいるので、構文アナライザーを磨く必要があります。誰かがこれを言語パーサーの初心者が理解できる言葉で表現できますか?

私の最大の混乱の原因は次のとおりです。

新しいMemberExpression引数

これはメンバー式であると想定されていますが、これは次のように矛盾しているようです。

NewExpression:
    MemberExpression
    新しいNewExpression

新しい式はメンバー式ですか、それとも左側式ですか?正直なところ、具体的な文法に適したC#クラスをレイアウトするのに苦労しています。

MemberExpression:
    PrimaryExpression
    FunctionExpression
    MemberExpression[式]
    MemberExpression。IdentifierName
    新しいMemberExpression引数

NewExpression:
    MemberExpression
    新しいNewExpression

CallExpression:
    MemberExpression引数
    CallExpression引数
    CallExpression[式]
    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;
    }
}
4

1 に答える 1

5

これを視覚化する別の方法があります。これは、セクション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はNewExpressionsであり、LeftHandSideExpressionsであるように見えます。これがお役に立てば幸いです。

于 2010-05-19T19:15:37.350 に答える