2013-02-13 1 views
2

나는 현재 GNU Bison을보고 프로그램 코드를 파싱하고있다. (실제로는 Bison을 사용하는 프로그램을 확장하기 위해). Bison은 LR (1) 문법 (즉, 특수 문맥없는 문법)만을 처리 할 수 ​​있습니다 (또는 : 최선). 사실 저는 문맥 자유 및 LR (1) 문법의 규칙을 이해하고 있습니다.LR (1) 문법 : 말하는 법? for/against에 대한 예제?

그러나 어쨌든 저는 LR (1) 문법의 개념을 잘 이해하지 못하고 있습니다. 예를 들어, SQL을 가정하십시오. SQL은 문맥이없는 문법을 사용합니다. LR (1) 문법입니까? 내가 어떻게 말할 수 있니? 그리고 그렇다면 LR (1) 규칙을 위반하는 것은 무엇입니까?

+0

실제로 : 부울 쿼리 및 부울 x 및 y에있는 SQL의 AND는 어떨까요? 그것은 LR을 위반합니까 (1)? – navige

답변

2

LR (1)은 감소 할 모든 토큰과 그 뒤에 하나의 토큰을 알면 줄일 수있는 적절한 규칙을 선택할 수 있음을 의미합니다. 부울 쿼리 및 BETWEEN 작업에서 AND은 문제가 없습니다. 다음 문법, 예를 들면 LL (1), 따라서 LR은 (1) 너무 :

expr ::= and_expr | between_expr | variable 
and_expr ::= expr "and" expr 
between_expr ::= "between" expr "and" expr 
variable ::= x 

나는 전체 SQL 문법이 LR보다 더 간단하다고 생각합니다 (1). 아마도 LR (0) 또는 심지어 LL (n).

+0

좋습니다! 예를 들어 주셔서 감사합니다. 그러면 SQL의 AND/BETWEEN 상황이 더 명확 해집니다! 그러나 SQL이 LR (1)보다 단순하다는 것을 어떻게 알 수 있습니까? 그것을보기위한 단서는 무엇입니까? (질문이 어리석은 경우 죄송합니다) – navige

+0

많은 SQL 구문은'SELECT ...','WHERE ...','FROM ...'과 같은 구문 이름으로 시작합니다. 이러한 구조는 LL (1) 문법에서 일반적입니다. 첫 번째 토큰 만보고 적절한 감원 규칙을 선택할 수 있습니다. –

+0

완벽하게 말이됩니다! 나는 내가 이해하기 시작할 것 같아. – navige

1

내 고객 중 일부는 LALR (1) 파서 생성기를 사용하여 SQL 및 DB2 파서를 만들어 수년 동안 성공적으로 사용했습니다. 그들이 보낸 문법은 LALR (1)입니다 (당신이 원하는대로 해결 된 교대 - 감소 충돌 제외). LALR (1)이 아닌 순 진자에게는 실제로 잘 작동하지만 GLR이나 LR (1)은 필요하지 않습니다. 더 강력한 LR (1), AFAIK도 필요하지 않습니다.

이 문제를 파악하는 가장 좋은 방법은 SQL 문법과 좋은 LALR/LR (1) 파서 생성기를 찾고 충돌 보고서가 있는지 확인하는 것입니다. LALR (1)이라는 SQL 문법이 여기에 있습니다 : http://lrstar.org/grammars.html

는 충돌 보고서를 제공하는 LALR (1) 파서 생성기입니다. 충돌을 해결하고 싶지 않으면 LR (*)도됩니다.