2011-02-16 7 views
4

을 표현하기위한 문법 표현, 형식적인 문법은 일반적으로 다음과 유사한 형태의 쉼표로 구분 된 목록을 표현 : 두 번 foo 언급이 피하기 위해 어떤 대안내 경험을 바탕으로 쉼표로 구분 된 목록

foo_list -> foo ("," foo)* 

입니까? 이 고안된 예제가 무죄로 보일 수도 있지만 foo이 아닌 사소한 표현이 발생합니다. 예를 들어 :

foo_list -> (bar | baz | cat) ("," ...)* 

... 토큰 (이 경우, (bar | baz | cat)에서) 앞의 표현을 의미한다 : 내 실험을하는 동안

foo_list -> ((bar | baz | cat)) ("," (bar | baz | cat))* 
+3

왜 비 사소한 표정으로 비 터미널을 만들 수 없습니다 : A -> 막대기 | 바스 | 고양이? – fbafelipe

+0

@fbafelipe : 비 터미널이 일반적으로 좋은 해결책이라는 데 동의합니다. 그러나 제 경우에는 새로운 비 터미널에 대한 이름을 만들지 않기를 바랬습니다. 그 중 많은 터미널이 있으며 때때로 중첩 된 식에 나타납니다. –

답변

1

나는 정확히 같은, 내가 한 번이 생산

foo_list ::= <* bar | baz | cat ; "," *> 

예로 쓴 것이다, 함께 일한 (독점) 파서 생성기를 기억한다. 위의 실제 메타 문자는 논쟁의 여지가 있지만 일반적인 접근 방식을 받아 들일 만합니다.

다른 파서 생성기를 작성할 때 나는 잠시 동안 무엇인가를 고려했지만 모델을 단순하게 유지하기 위해 그것을 떨어 뜨렸다.

물론 구문 다이어그램은 잘 원치 않는 반복없이 나타낼 수

foo_list

0

,이 구문은 몇 가지 가능성을 보여 주었다.

이것은 완벽한 해결책은 아니지만 토론을 위해 설명하고 있습니다.

관련 문제