2016-11-27 4 views
1

나는 grako 맞춤 ebnf 문법을 작성하려고합니다. 정규 표현식을 파싱하려고 할 때 생성 된 파서가 공백이나 주석을 넘어서지 않는 것으로 나타났습니다.정규 표현식이 포함 된 경우 grako의 공백 처리

문서는,이 공백이나 의견이 이상 진행되지 않는 다른 표정과는 달리 그 주제

에서 다음을 말한다. 이를 위해 정규 표현식을 고유 한 규칙의 유일한 용어로 사용하십시오.

그런 다음 하나의 정규식 규칙만으로 간단한 문법을 ​​만들었습니다. 정규 표현식도 그 규칙 내의 유일한 용어입니다.

@@eol_comments :: ?/(#[^\r\n]*)|(\/\/[^\r\n]*)/? 
@@comments :: ?/\s*\/\*(.|[\r\n])*?\*\//? 

Start  = NameList $; 
NameList = { Name } ; 
Name  = /[a-zA-Z_][a-zA-Z0-9_]+/ ; 

"abc \ ndef"및 "abc \ ndef"입력에서 생성 된 구문 분석기가 실패합니다. 첫 번째 줄 바꿈, 첫 번째 줄 바꿈, 두 번째 줄 바꿈.

정규 표현식에서만 발생하며 다른 규칙은 잘 작동합니다. 이름이 다음과 같이 정의 된 경우

Name  = 'abc' | 'def' ; 

그러면 위의 입력이 성공적으로 구문 분석됩니다.

문법이 공백 및 주석보다 앞당겨 지도록 동작을 변경하려면 어떻게해야합니까?

추가 정보 : 위의 입력

흔적 :

<Start 
<1:1>abc 

<NameList<Start 
<1:1>abc 

<Name<NameList<Start 
<1:1>abc 

>'abc' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:4> 

>Name<NameList<Start 
<1:4> 

<Name<NameList<Start 
<1:4> 

!'' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:4> 

>NameList<Start 
<1:4> 

!Start 
<1:1>abc 

<Start 
<1:1> abc 

<NameList<Start 
<1:1> abc 

<Name<NameList<Start 
<1:1> abc 

!'' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:1> abc 

>NameList<Start 
<1:1> abc 

!Start 
<1:1> abc 

나는 다음과 같은 명령을 사용하여 파서를 생성 :

grako --generate-parser --outfile parser.py test.ebnf 

및 -w 옵션 (/ \ s +/및/[\ t \ n \ r] +/동작을 변경하지 않음)을 사용하여 공백을 지정하려고 시도했습니다.

다음 구문을 사용하여 파서를 시작했습니다. 대문자로 시작

python parser.py eztest.txt Start -t 

답변

0

규칙 이름은 에 Grako 특별하다. 문서에서 설명 하듯이, 구문 분석을 시작하기 전에 공백을 넘어서서 진행하지 않습니다.

문법의 규칙 이름을 소문자로 시작하도록 변경하십시오.

카멜 케이스 또는 파이썬 스타일 규칙 이름을 사용자에게 남겨 두지 않는 이유는 무엇입니까?

  • 그것은 간단하고 언어의 어휘 측면에 큰 유연성을 허용하기 쉬운 구현 디자인 선택이었다 그것은 파이썬 프로그래머가 파이썬 스타일의 이름이 편안하게 될 것이라고 예상했다
  • 전산화 된 문법 및 파서의 전통은 규칙 이름에 소문자를 사용하는 것입니다.
+0

아, 감사합니다. 정규 문법에 대해 배웠던 과정에서 우리는 문법 규칙에 대문자 이름을 사용하고 AST의 속성에 대해 소문자 이름을 사용했습니다. 그래서 그것은 자연스럽게 "다음과 같이 규칙을 씁니다." –