2011-08-17 8 views
0

DSL을위한 파서를 빌드하려고합니다. .NET에서 아이러니를 사용하여 건물을 만들고 있습니다. 문제를 찾지 못했습니다. BNF를 다루기 때문에 어떤 BNF 솔루션이 도움이 될 것이라고 생각합니다. 다음 문법으로BNF 문법의 모호성 처리하기

 
$10 yesterday at drug store 

:

<expr> :== unit | expr + unit 
<unit> :== money | date | location 

<date> : == yesterday|today|tomorrow 
<location> :== .* | <preposition> .* 
<preposition> :== at 
<money> :== ((\$)?\d*((\.*)\d*)*\,?\d{1,2}) 

그것은이 입력와 매력처럼 작동

나는 다음과 같은 입력을 가지고있다.

Money Amount: 10 
Date: Yesterday 
Location: Drug Store 

그러나, 나는 그것 때문에 나에게 동일한 출력을 제공하지 못하는 단계를 줄일 수의

$10 at drug store yesterday 

을 다음과 같이 입력의 순서를 변경하는 경우 : I는 내가 원하는 정확하게 결과를 얻을. 출력이된다 :

Money amount: 10 
Location: Drug Store Yesterday 

다른 모든 토큰을 캡처하고 다른 아무것도 남아 있지 않을 때 (정말 넓은 정규식 일치) 위치 만 평가되어 있는지 확인하는 방법이 있는지 궁금 해서요.

도움을 주시면 감사하겠습니다.

감사합니다.

편집 :이 내가 새로운 터미널을 만들어 아이러니 내 문제를 해결할 수 있었다 BNF 모호성에 대한 일반적인 대답은 아니라는 사실 또한 제안

+0

을 : 그래서 다른 사람이 (주 아이러니 프로젝트에 추가되지 동안)이 문제, 새로운 터미널의 코드가 발생하면

이 링크에서 찾을 수 있습니다 BNF에 관한 것, 그 자체. BNF 문법에는 규칙의 "우선 순위"개념이 없습니다. 당신이 가지고있는 것은 모호한 문법입니다. 즉, 귀하의 언어로 된 일부 문자열의 파생어가 두 개 이상 있습니다. 이 문제를 해결할 수있는 BNF 중심의 유일한 방법은 모호하지 않은 문법을 생각해내는 것이고 이것이 항상 가능하지는 않습니다. 귀하의 경우 명백한 문법을 ​​얻으려는 분명한 방법은 을 정의하여 "어제"같은 것을 포함하는 문자열을 잡아서 유효한 위치로 허용하지 않도록하는 것입니다. – Patrick87

+0

의견을 남겨 주신 Thanks @ Patrick87. 어제 제가 정의에서 "무시"하는 것 이상을 가지고 있다고 가정 할 때, 어떻게하면 좋을까요? "이것에 부합하고 모두 제외하십시오"라고 말할 수있는 방법이 있습니까? – tucaz

+0

쉬운 방법과 어려운 방법이 있습니다. 쉬운 방법은 정규식 구문의 기능에 따라 다르며 모든 정규 표현식에 대해 어려운 방법을 사용하지만 작업을 수행해야합니다. "set difference/except", "union", "intersection", "complement"등과 같은 연산자/연산에 대한 정규식 구문을 확인해야합니다. 이렇게 할 수 있다면 쉽습니다. 그렇지 않으면 앉아서 거부하려는 문자열을 수락하는 DFA를 만들고 보완 DFA를 만든 다음이를 기반으로 정규식을 만들어야합니다. 이 과정을 덜 고통스럽게 만들기 위해 일부 자동화 된 도구가있을 수 있습니다. – Patrick87

답변