배열 및 구조가있는 프로그래밍 언어에 대한 타사 구문 분석기로 작업하고 있습니다. 다음 식에 대한 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"
)
)
중, 실행 순서의 관점에서 많은 이해가되지 않습니다.
'Foo.X + Foo.Y'의 바로 가기로'Foo. (X + Y) '와 같은 것을 쓸 수 있도록 허용 할 수 있습니까? – sepp2k
저도 조금 이상하게 보입니다. 그러나 대서양 표준의 실제 이론은 없습니다. 때로는 구문 분석 요구 사항 (특히 LL 문법을 사용할 때)을 사용하면 원하는 내용이 아닌 문법을 사용하게되며 이후 AST를 조정해야합니다. 호기심에서 벗어나, A가 구조체의 배열이면, S.A [I] .T에 대해 무엇을 얻습니까? – rici
@ sepp2k : 내 지식을 최대한 활용하지 못했습니다. –