2012-09-18 2 views
0

Irony .NET을 사용하여 합리적으로 복잡한 주사위 롤링 지침을 처리 할 수있는 간단한 DSL을 만들려고합니다. 기본 계산기 기능은 구현하기에 충분히 간단했습니다 (더하기, 빼기 등). 그러나 마침내 롤 표현을 추가 할 시점에 도달했을 때 문제가 발생했습니다. 이상적으로, 다음과 같은 형식의 롤 표현식을 사용합니다. ndm 여기서 n은 롤 할 다이의 수이고, m은 각 다이의면 수입니다.Irony .NET - 연산자로 사용하는 문자

여기 내 문제는 내가 d의 옆에 표현을 원한다는 것입니다. 제가 이것을하면 아이러니가 d가 유효하지 않은 문자라고 불평합니다. 주변 공간이 일 (1 일 6 일), 영숫자가 아닌 문자로 교체 (1 % 6). 현재 나는 소스의 각 d를 "d"로 바꾸는 것으로 간단하게 작업하지만, 변수를 얻을 때 분명히 작동하지 않을 것입니다. (변수를 설정하기 위해 '$'로 시작합니다).

질문 : 공간 (1d6)없이 작업을 수행하려면 어떻게해야합니까? 문법이 크게 변경되지 않는 것이 좋습니다. (참고 : 그것은 여전히 ​​공백으로 작동하는지 완벽하게 괜찮아, 난 그냥이 필요하지 않습니다.)

expression = new NonTerminal("expression"); 
add = new NonTerminal("add"); 
subtract = new NonTerminal("subtract"); 
multiply = new NonTerminal("multiply"); 
divide = new NonTerminal("divide"); 
roll = new NonTerminal("roll"); 

expression.Rule = number | add | subtract | multiply | divide | roll; 
add.Rule = expression + "+" + expression; 
subtract.Rule = expression + "-" + expression; 
multiply.Rule = expression + "*" + expression; 
divide.Rule = expression + "/" + expression; 
roll.Rule = expression + "d" + expression; 

RegisterOperators(1, "+", "-"); 
RegisterOperators(2, "*", "/"); 
RegisterOperators(3, "d"); 

MarkPunctuation("+", "-", "*", "/", "d"); 
MarkTransient(expression); 

this.Root = expression; 

답변

1

문제는 어디 토큰의 시작과 끝을 말하는 방법이 필요하다. 처음에는 문자열을 토큰으로 분리 할 수 ​​없지만 문법은 무엇이 무엇인지 파악할 수 없습니다. 나는 아이러니가이를 지원하지 않습니다 믿는다

는 AssignWhitespaceAndDelimiters()를 살펴 보라는 "D"키 용어 목록에 추가 할 필요가, 또는 구분 자체로 추가 할 수있는 것 같습니다.