2016-07-31 6 views
2

나는 이름 난 같은 표기법 사용 가능한 모든 문자를 나열해야, 심지어 영숫자가 아닌 문자를 포함 할 수 리스프 프로그래밍 언어, 정의 예를 들어 원하는 경우BNF 및 EBNF 표기법에서 정규 표현식을 사용할 수 있습니까?

validchar ::= "a" | "b" | "c" ... "-" | "*" | "$" ... ; 
name = validchar, (validchar | digit)+; 

을 또는 내가 사용할 수 오전 정규식 등에서 특정 요소를 뽑아 오기, 같은 : 심지어

validchar ::= "[^(^)^\s^\d]"; 
name ::= validchar, (validchar | digit)*; 

또는 :

name ::= "[^(^)^\s^\d]", "[^(^)^\s]"*; 

이 그것을 많이 단축 것이며, 심지어 문자를 포함 할 것 나는 목록에 올릴 수는 없지만 실제로 사용할 수있는 ₩, ¥, € 등등. 이 허용되는지 여부

답변

3

은 당신이이 (E) BNF 표기법을 구현하고 사용하는 도구에 따라 달라집니다.

일부 도구는 가장 Kleene * 또는 + 언어 토큰에 허용 다소 엄격하고 (E) BNF의 원래 정의에 충실. 또 다른 요점은 클래식 (E) BNF가 문자로 터미널을 조작 할 필요가 없다는 것입니다.

문자로만 언어 토큰을 직접 정의 할 수있는 것은 분명하며, 문자를 단말기로 쓸 수 있고 문자를 정규식으로 작성할 수있는 EBNF를 상상할 수 있습니다.

당신이 사용하는 제안이 도구는 ... 도구에 전적으로 의존 할 수 있는지 여부. YACC와 같은 공정 (E) BNF 등이 실제로 다른 도구, 토큰 문자 순서를 정의 (YACC를 들어,이 FLEX라고합니다)는 "렉서 생성기"와 함께 작동하도록 설계되어 많은 도구를 제공합니다. 이러한 도구 쌍을 사용하면 (E) BNF 도구는 대개 문자 또는 정규식에 대한 언급을 허용하지 않지만 렉서 생성기 도구는 명시 적으로 토큰에 대한 문자 및 정규식 사양을 허용합니다.

은 (E) BNF와 렉서 생성기 도구, 다소 (터무니 다른) 규칙 각각의 수백이있다. 도구 설명서를 확인하십시오.

아니면 당신이 그것을 쓰고, 자신의 (101) 도구를 구축 할 방법을 쓰기.