2012-03-29 7 views
4

매우 간단한 규칙 언어에 대한 공식 사양을 만들고 있는데, 매우 간단합니다. EBNF를 표준으로 사용하고 싶지만 조작 순서를 지정하는 방법을 알 수 없습니다. 지금까지는 스펙이 있습니다.Extended Backus-Naur Form 작업 순서

rule = statement, { (‘AND’|’OR’), statement}; 

variable = ‘$’,alphabetic character, {alphabetic character | digit}; 

statement = variable, [ ‘count’,[white space ],’>’,[white space],number ]; 

alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G" 
        | "H" | "I" | "J" | "K" | "L" | "M" | "N" 
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U" 
        | "V" | "W" | "X" | "Y" | "Z" ; 

number = [ "-" ] , digit , { digit } ; 

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 

white space = ? white space characters ? ; 

내가 가지고있는 질문은 어떻게 괄호 안의 것들이 먼저 평가되어야 하는지를 어떻게 보여줄 것인가입니다. 이

$strap AND ($greenSticker count > 5 OR ($greenSticker AND $redSticker)) 

같은 그래서 뭔가는 대부분의 언어에 대한 공통 기능처럼 보이지만, 내 Google 기술은 나에게 실패와 나는 예를 찾을 수 없습니다. 당신이 볼 수 있듯이, 낮은 우선 순위 (+-)와 운영자가보다 일반적인 우선 순위가 높은 사업자보다는 규칙 (*/

expression -> (+|-|ε) term ((+|-) term)* 
term -> factor ((*|/) factor)* 
factor -> var | number | (expression) 

있습니다 간단한 예를 들어, LL 문법으로이 주어

답변

11

). 올바른 구문 분석 트리를 만드는 것이 전부입니다. 일반적으로 "외부"규칙 또는 일반 규칙의 우선 순위가 낮으므로 term을 더 파생해야하기 때문에 더하기와 빼기 연산자는 term 옆에 배치해야합니다. 좀 더 복잡한 문법을 ​​살펴보면 적절한 우선 순위를 갖기 위해 이것이 극단적 인 것으로 간주됩니다.

+1

문법 규칙에서 우선 순위를 표현할 때 왜 하향식 분석과 상향식 구문 분석을 구분하는지 알 수 없습니다. 앞에서 말했듯이 올바른 파스 트리를 만드는 것이 전부입니다. 결과적으로 동일한 결과를 얻으려면 하향식 또는 상향식으로 구성하십시오. 물론 이것은 몇 가지 함의를 지니지 만 파싱 기술을 (이런 종류의) 우선 순위와 관련시키는 방법은 분명하지 않습니다. 설명 해주십시오. – Gunther

+1

그 표현 문법은 상향식 파서에서도 작동하며, 재귀 형 파서 에서뿐만 아니라 하향식 LL 파서에서도 작동합니다. 프랫 파서는 재귀 - 하강 및 하향식입니다. 두 번째 단락은 실제로 나에게 의미가 없습니다. – EJP

+0

두 가지 문제를 해결하기 위해 혼란스러운 단락을 제거했습니다. 나머지 대답이 도움이되기를 바랍니다. –