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