문제
0과 255 사이의 소수점 수를 수락하고 싶습니다. 이것은 내가 생각해 낼 수있는 최고입니다.
fragment my_token : ('0'..'9') | // 0 -> 9 ('1'..'9' '0'..'9') | // 0 -> 99 ('1' '0'..'9' '0'..'9') | // 100 -> 199 ('2' '0'..'4' '0'..'9') | // 200 -> 249 ('25' '0'..'5'); // 250 -> 255
그러나 나는 단지 Clueless N00B입니다. 더 나은 방법이 있습니까?
해결책
렉서를 이완시키고 나중에 검사를 연기하면 훨씬 더 나은 결과를 얻을 수 있습니다. 법률 NUMBER
, 나중에 변환하면 값이 범위를 벗어난 경우 매우 구체적인 오류 메시지를 제공 할 수 있습니다. Lexer를 엄격하게 만들고 누군가가 256에 들어가면, 이전에 문법을 만들지 않은 사람이 결과를 얻을 수없는 오류 메시지를 불법으로 만듭니다.
NUMBER
: '0'..'9'+
;
다른 팁
나는 280Z28의 답변을 올렸다 - 거기에서 제안 된 것을하십시오. 그러나 패턴을 작성하는 다른 방법을 원한다면 시도 할 수 있습니다.
0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?
다른 무엇보다 내가 과시하는 것이 더 많습니다. 확인하기가 어렵습니다 (내가 처음 썼을 때 테스트 할 때까지 잡히지 않은 실수를 저질렀을 때). 코드에서 사용해야 할 것이 아닙니다.
제휴하지 않습니다 StackOverflow