나는 내 자신의 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;
}
}
이 중 어떤 부분에 문제가 있습니까? 렉서가 있니? 구문 문법은 어휘 문법 토큰을 터미널 기호로 사용하므로 어휘 문법을 먼저 이해해야합니다. 터미널 기호로만 구성된 작품을 작업 한 다음 비 단자마다 위로 이동합니다. –
@Andy - 저는 작업 렉서가 있는데, 프로젝트의 가장 쉬운 부분이었습니다. 나는 또한 구체적인 문법의 대부분을 완성했다. 나는이 부분을 이해할 수없는 것 같습니다. – ChaosPandion
확인. 미안하지만 아직까지는 사양 에까지 미치지 못했습니다. 그러나 LeftHandSideExpression에서 NewExpression을 상속 받았지만 (NewExpression보다는) ConcreteExpression에서 MemberExpression을 상속 한 것이 이상한 것처럼 보입니다. –