2010-05-19 3 views
3

나는 내 자신의 ECMAScript 구현을 꽤 오랫동안 연구 해왔다. 저는 기본적으로 모든 것을 손으로 처리하여 프로세스에 대한 깊은 이해를 돕습니다. 이 부분의 문법을 분석하고 이해하려는 반복 시도는 실패 했으므로 프로젝트의 다른 부분에서 작업했지만 지금은 필자의 구문 분석기를 연마 할 필요가있는 객체 리터럴에 대해 작업 할 예정이었습니다. 초보자가 이해할 수있는 언어 파서라는 용어로이 단어를 넣을 수 있습니까?ECMAScript 문법의이 부분을 번역하는 데 도움이 필요합니까?

혼란의 나의 가장 큰 원인은 다음과 같다 :

 
NewExpression : 
    MemberExpression 
    new NewExpression 
:이 멤버가 발현 될 예정이다

새로운 MemberExpression 인수

있지만 다음이 겉으로 충돌

새 표현식은 구성원 표현식이나 왼쪽 표현식입니까? 솔직히 말해서 구체적인 문법에 맞는 적절한 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; 
    } 
} 
+0

이 중 어떤 부분에 문제가 있습니까? 렉서가 있니? 구문 문법은 어휘 문법 토큰을 터미널 기호로 사용하므로 어휘 문법을 먼저 이해해야합니다. 터미널 기호로만 구성된 작품을 작업 한 다음 비 단자마다 위로 이동합니다. –

+0

@Andy - 저는 작업 렉서가 있는데, 프로젝트의 가장 쉬운 부분이었습니다. 나는 또한 구체적인 문법의 대부분을 완성했다. 나는이 부분을 이해할 수없는 것 같습니다. – ChaosPandion

+0

확인. 미안하지만 아직까지는 사양 에까지 미치지 못했습니다. 그러나 LeftHandSideExpression에서 NewExpression을 상속 받았지만 (NewExpression보다는) ConcreteExpression에서 MemberExpression을 상속 한 것이 이상한 것처럼 보입니다. –

답변

5

다른 시각화 방법이 있습니다. MemberExpressions이 NewExpressions, 차례로, LeftHandSideExpressions은 마치

LeftHandSideExpression : 
    NewExpression : 
     MemberExpression : 
      PrimaryExpression 
      FunctionExpression 
      MemberExpression [ Expression ] 
      MemberExpression . IdentifierName 
      new MemberExpression Arguments 
     new NewExpression 
    CallExpression : 
     MemberExpression Arguments 
     CallExpression Arguments 
     CallExpression [ Expression ] 
     CallExpression . IdentifierName 

: 이것은 내가 섹션 11.2에서 제작의 일반적인 계층 구조를 볼 수있는 방법입니다. 이게 도움이 되길 바란다.

+1

다른 관점에서 가져올 수있는 것은 정말 놀랍습니다. 나는 당신에게 맥주를 사 주겠다. 그리고 너의 명예를 위해 그것을 마시 게 될 것이다. 감사. – ChaosPandion

+1

굉장하다 - 내가 도울 수있어서 기뻐. 나는 내 명예의 맥주도 마실 것이다. ;) –

관련 문제