2014-11-05 3 views
-2

배열 및 구조가있는 프로그래밍 언어에 대한 타사 구문 분석기로 작업하고 있습니다. 다음 식에 대한 STR,이 호출 배열을 포함하는 구조 형식 변수라고 가정하고, I는 정수 변수 :배열에서 구조체 참조 구문 분석

Str.A[I] 

를 파서 (의사의) 다음 식 트리를 생성한다 :

StructMember 
(
    Left = "Str" 
    Right = ArraySubscript 
    (
     Left = "A" 
     Right = "I" 
    ) 
) 
실행 또는 코드를 생성 할 때, 먼저 구조체 멤버를 해결

ArraySubscript 
(
    Left = StructMember 
    (
     Left = "Str" 
     Right = "A" 
    ) 
    Right = "I" 
) 

때문에, 다음 첨자를 수행

나는 다른 무언가를 기대하고 있었다.

이론적 인 관점에서, 먼저 평가되는 연산이 다음에 평가되는 연산보다 구문 트리에서 더 깊지 않아야합니까? 즉,이 동작을 파서에서 버그로 간주해야합니까? RICI에 대한

편집 : STRA가 구조체의 배열 인 경우, 여기에 내가 얻을 나무가있다 : 표현 STRA [I] .A [I]에 대한했다

StructMember 
(
    Left = ArraySubscript 
    (
     Left = "StrA" 
     Right = "I" 
    ) 
    Right = ArraySubscript 
    (
     Left = "A" 
     Right = "I" 
    ) 
) 

.

EDIT2가 : 표현 S.A [I] .T를 들어, 여기에 내가 무엇을 얻을 :

StructMember 
(
    Left = "S" 
    Right = StructMember 
    (
     Left = ArraySubscript 
     (
      Left = "A" 
      Right = "I" 
     ) 
     Right = "T" 
    ) 
) 

중, 실행 순서의 관점에서 많은 이해가되지 않습니다.

+0

'Foo.X + Foo.Y'의 바로 가기로'Foo. (X + Y) '와 같은 것을 쓸 수 있도록 허용 할 수 있습니까? – sepp2k

+1

저도 조금 이상하게 보입니다. 그러나 대서양 표준의 실제 이론은 없습니다. 때로는 구문 분석 요구 사항 (특히 LL 문법을 사용할 때)을 사용하면 원하는 내용이 아닌 문법을 사용하게되며 이후 AST를 조정해야합니다. 호기심에서 벗어나, A가 구조체의 배열이면, S.A [I] .T에 대해 무엇을 얻습니까? – rici

+0

@ sepp2k : 내 지식을 최대한 활용하지 못했습니다. –

답변

0

대부분의 언어에서 멤버 액세스 연산자의 오른쪽 피연산자는식이 아닌 식별자가됩니다. 이 경우 당신이 문법에 맞지 않는받은 AST를

expression ::= 
    ... 
    | expression '.' identifier 

: 그에 대한 문법은 다음과 같이 보일 것입니다.사실 노드 의 right 구성원은 expression 유형이 아니어야하며 string (또는 식별자를 나타 내기 위해 사용하는 이름)을 입력해야합니다.

트리는 Str.(A[I])과 같습니다.이 트리는 해당 문법에 따라 유효한 구문이 아닙니다.

그것은 언어의 문법이 아닌처럼 보이는 것이 이론적으로 가능하다 : 그런 경우에는

expression ::= 
    ... 
    | expression '.' expression 

Str.(A[I])이 유효 구문하고 .의 우선 순위가 배열 첨자보다 낮은 경우 것입니다, Str.A[I]은 실제로 Str.(A[I])으로 구문 분석되어 올바른 트리를 만듭니다. 이것은 매우 드문 일이며 의견에서 귀하는 귀하가 아는 한 최선을 다할 것이라고 말했습니다.

그래서 우리는 당신 언어의 문법이 내가 처음 보여준 것과 비슷하다고 생각해야합니다. 파서는 버그가 있거나 정확하게 문법과 일치하는 나무를 제공하기위한 것이 아닙니다.

+0

트리가 공식 문법과 일치하는지 여부는 파서의 버그 체크의 진정한 척도입니다. –

1

그것은 우리가 같은 간단한 뭔가를해야 할 정보가 무엇인지 고려하는 것이 도움이 될 수 있습니다 : 나는 구문 분석 트리를보고 기대, 여기

X[i]

뭔가 같은 :

ArraySubscript ( Left = "X" Right = "i" )

따라서 배열의 경우 Left 및 Right 속성이 필요합니다. struct 멤버에 대한 참조의 경우 왼쪽에서 구조체를 참조하고 parse-tree의 오른쪽면에서 struct 특성을 참조해야합니다.

Str.simple

:

StructMember ( Left = "Str" Right = "simple" )

이 같은 것을 참조하기 : 구조체의 속성은 정수와 같은 간단한 유형, 다음 StructMember는 다음과 같이 보일 수 있다면, 예를 들어 고려 보고있는 결과는 각 속성을 고려하는 방법에 대한이 간단한 분석과 일치합니다.

+0

나는 확신하지 못합니다. 귀하의 원시 예제는 완벽한,하지만 내 구체적인 경우에는 거기에 두 가지 겉으로보기에 실행 가능한 옵션 - 상단에 structmember 대 첨자. 질문은 - 이론이 옳다고 말하는 것입니다. 두 요소에서 왼쪽과 오른쪽 모두 표현식이 될 수 있습니다. –

+1

참고 : A [I]은 구조 멤버가 아닙니다. 그렇소. –

+1

아. 귀하의 문제를 이해합니다. 귀하의 질문에 대한 답변은 결국 운영 명령 및 귀하의 구속력있는 규칙에 의해 해결 될 것입니다. 구조체 멤버쉽을 해결할 때 더 높은 우선 순위를두면 결과에 도달하게됩니다. 또는 오른쪽에서 왼쪽으로 해결하면 결과에 도달하게됩니다. 왼쪽에서 오른쪽으로 해석하거나 배열 참조에 더 높은 연산 우선 순위를두면 사용자가 본 결과에 도달하게됩니다. 이것은 문법이 어떻게 정의되는지에 대한 질문입니다. –