문제

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]?

다른 무엇보다 내가 과시하는 것이 더 많습니다. 확인하기가 어렵습니다 (내가 처음 썼을 때 테스트 할 때까지 잡히지 않은 실수를 저질렀을 때). 코드에서 사용해야 할 것이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top