BNF 문법+금 LALR 파서 실패를 구분하는 특별한 경우 줄 바꿈에서 공백

StackOverflow https://stackoverflow.com/questions/599409

  •  11-09-2019
  •  | 
  •  

문제

  • 내가 원하는 고려하는 공백 및바꿈 정상적으로 공백.
  • 내가 원하는 구별하는 줄 바꿈에서 다른 공백 또한을 허용하는 특별한 경우입니다.

첫째로 쓰려고 하면 준수 문법은 실패합니다.

여기에는 문법:

! ------------------------------------------------- Sets

{WS}           = {Whitespace} - {CR} - {LF}
{ID Head}      = {Letter} + [_]
{ID Tail}      = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]

! ------------------------------------------------- Terminals

! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed 
! characters

Whitespace    = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine       = {CR}{LF} | {CR} | {LF}
MyNewLine      = {CR}{LF} | {CR} | {LF}
도움이 되었습니까?

해결책

둘 다 동일한 하위 세트를 포함하기 때문에 모호합니다. {CR}{LF} | {CR} | {LF}.

입력이 주어졌습니다 {CR}{LF} 파서는 어떤 터미널을 일치시켜야하는지 알 수있는 방법이 없습니다.

테이블 구동 파서는 실제로 "특별한 경우"를 직접 처리하도록 설계되지 않았습니다. 어떤 상황에서는 새로운 선을 무시하고 싶지만 다른 상황에서는 의미를 나타내려면 감축에서이를 처리해야합니다 (즉, 최신 라인을 개별적으로 토큰 화하고 감축에서 버려야합니다). .

(잠재적으로) 더 나은 솔루션은 토큰 화제 상태 (파서에서 제어)를 사용하여 Newline 입력이 토큰 화되는 방식을 변경하는 것입니다. 문법을 완전히 이해하지 않고 말하기는 어렵습니다. 게다가, 내가이 물건을 엉망으로 만든 지 몇 년이 지났습니다.

다른 팁

나는 공백과 MyNewline이 새로운 라인 charachters와 일치한다는 의미에서 문법이 모호하다고 생각합니다. 그것은 당신의 길을 거울로 던지기 때문에, 나는 공백과 새로운 라인을 개별적으로 감지하고 사례별로 Newline과 무엇을 해야하는지 결정하는 것이 좋습니다.

나는 그 지역에서 너무 경험이 없지만, 그것이 계산 클래스 및 컴파일러 디자인 클래스에 대한 이론에서 기억하는 것입니다.

이게 도움이 되길 바란다.

늦은 대답합니다.

그러나 실망스럽게도,이제 나는 최근에 늦은 시기;-)회원입니다.

유지를 사용하는 일반 라인에 근거한 문법 선언

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

공백을 대Newline 차이는 이미 고려!

고려를 해결하는 특별한 케이스를 작성할 때 귀사의 생산 규칙이 있습니다.

복잡한 경우도 있을 정의해야 어떤 가상 터미널(고급 기술).

할 수 있는 정교한 귀하의 문법과 요구를 게시하여 그것을 다시합니다.

마지막 편집:시고,공유하는 경우에 당신은 이미 해결된 문제입니다.감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top