나는 다른 사람의 사이에서 다음과 같은 구조를 가지고 언어에 대한 들소의 파서를 쓰고 :LALR (1) 파서가 파싱 할 수 있습니까?
- 자기 파견 : [
identifier
arguments
] - 파견 : [
expression
.identifier
arguments
] - 문자열 자르기 :
expression
[expression
,expression
] - 파이썬과 유사합니다.
arguments
은 쉼표로 구분 된 표현식 목록이며 비어있을 수도 있습니다. 위의 모든 것은 독자적으로 표현 된 것입니다. 제 문제는 [method [other_method]]
과 [someString[idx1, idx2].toInt]
을 구문 분석하는 방법이나 LALR (1) 파서를 사용하여이 작업을 수행 할 수 있는지 잘 모르는 것입니다.
좀 더 정확히 말하자면 다음 예를 생각해 보겠습니다. [a[b]]
(메서드 호출, b
메서드 호출). 상태가 [a
에 도달하면 [b]]
(룩어 두 번째 [
이다), 그것은 a[b,c]
같은 따를 수 있기 때문에 그 자체가 expression
로 감소 될 수있는 (expression
에 (이미 identifier
로 감소 된) a
을 절감하고 두 번째 구조를 계속할지 여부를 알 수 없습니다 위에서 arguments
의 목록 (이 경우 [b]
등)이 표시 될 것이므로 identifier
(계속 이동하십시오)을 유지하십시오.
이 문법을 사용하는 방식 때문에이 시프트/축소 충돌이 발생합니까? 아니면 LALR (1) 구문 분석기로 모든 구문을 구문 분석 할 수 없습니까?
그리고 좀 더 일반적인 질문은 특정 유형의 파서가 언어를 구문 분석 할 수 없다는 것을 어떻게 증명할 수 있습니까?
"특정 유형의 파서가 뭔가를 파싱 할 수 없다는 것을 어떻게 증명할 수 있습니까?" "무언가"에 대해 명시 해주십시오. [언어와 문법의 차이점] (/ a/476009/824425) (그 답은 LL (1)에 관한 마지막 질문에 답해야하지만, 모든 파서 유형에 대해 일반적으로 답합니다). 여기에 설명하는 것은 언어의 일부 기능이지만 문법이 없으면 실제로 이야기 할 부분이 많지 않습니다. –
@Rhymoid 내가 더 명확하게 편집했습니다. 문법이 아닌 언어에 대해 묻고있었습니다. 그리고 질문의 일부로 쓴 문법을 추가 할 필요가 없다고 생각합니다. LALR (1)에 의해 * 언어 * (일부 구문이 더 정확함)를 파싱 할 수 있는지 묻고 있기 때문입니다. 문법이 아닙니다. –
@EJP 있습니다. 위에서 설명한 shift/reduce 충돌이있는 문법을 작성했습니다. 나는 그것을 피하는 방법을 많이 생각했고 실패했습니다. 그리고 지금은 문법을 작성하는 방법과 상관없이 LALR (1) 구문 분석기로 구문 분석 할 수없는 언어 자체가 있다고 생각했습니다. –