質問

私はかなり長い間、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 は NewExpressions であり、NewExpressions は LeftHandSideExpressions であるように見えます。これがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top