2016-12-11 10 views
0

다음과 같은 문법이 있습니다.antlr을 사용하여 반복 속성을 구문 분석하는 방법은 무엇입니까?

meta : '<' TAG attribute* '>'; 

attribute : NAME '=' VAL; 

TAG : [A-Z0-9]+; 

NAME : [A-Z_-]+; 

VAL : '"'.*?'"'; 

다음 문자열과 일치 시키려합니다.

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> 

하지만 다음과 같은 오류가 발생합니다.

ParseError extraneous input 'CONTENT' expecting {'>', NAME} clj-antlr.common/parse-error (common.clj:146) 

하나의 속성으로 구문 분석 할 수 있습니다.

<META HTTP-EQUIV="Content-Type"> 

반복 속성을 구문 분석하는 방법은 무엇입니까? attribute*을 주면 아무 효과가 없습니다.

업데이트 : 실제로는 렉서가 원인입니다. TAGNAME을 결합하면 작동합니다.

meta : '<' NAME attribute* '>'; 
NAME : [A-Z0-9_-]+; 

하지만 숫자를 포함하는 NAME을 가지고 싶지 않아. 이 일을 할 수있는 방법이 있습니까?

답변

1

당신은 두 개의 독립적 인 렉서 규칙을 사용하고 그것에게 그것을 가능하게하기위한 다른 채널을 사용할 수 있습니다 무시되는 요소 사이의 공백에 문제가있는 경우 다음 각각

ID: [A-Za-z]+ ; 
NUMBER: [0-9]+ ; 

tag: ID+ tag? | NUMBER+ tag? ; 
name: ID+ name? | ('_' | '-')+ name? 

그들을 결합하는 파서 규칙을 사용할 수 있습니다 위의 파서 규칙에서만 ... 위 구문 분석기 규칙을 렉서 규칙으로 정의 할 수도 있지만 그 내용을 잘 모르겠습니다.