파서 생성기 (Antlr, YACC 등)에서 이름 = 값 쌍 목록을 구문 분석하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/897934

문제

나는 (공백 분리 된) 쌍의 목록을의 형태로 구문 분석하고 싶습니다.

name1=value1 name2=value2 ...

어디:

  • 이름에는 공백 및 동일한 부호를 제외한 모든 것이 포함될 수 있습니다
  • 값은 공백을 제외한 모든 것을 포함 할 수 있습니다 (동일 표시 포함!)

문제는 파서가 입력과 같은 일치하는 것입니다.

name1=value1

별도의 'NAME EQUALS VALUE' 토큰, 싱글이 아닙니다 'VALUE' 토큰.

추신. 나는 이것이 직접 코딩하기가 사소한 것을 알고 있지만, 더 큰 파서의 맥락에서 이것을 필요로합니다.

도움이 되었습니까?

해결책

여기에 antlr에있는 것이 있습니다.

a=b=c=d c=d e=f

이것은 필요한 모든 것이 아닐 수도 있지만 핵심이어야합니다.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

ID  :  ~(' ' | '=')*;

다른 팁

값에 동일한 부호를 포함 할 수 있다면 문제가 발생할 수 있다고 생각합니다. 가능하다면 동등한 표시를 예약 된 캐릭터로 만들거나 다른 예약 된 캐릭터로 전환하여 '='를 의미합니다.

이것이 더 큰 파서의 맥락에서 작동하는지 확실하지 않지만 공간에서 분할하여 'Name = value'쌍의 배열 (또는 언어가 사용하는 모든 데이터 구조)을 제공 할 수 있습니다. 그런 다음 배열을 루프하고 '='에 사용하는 예약 된 문자로 다시 분할하십시오. '='를 변경하거나 예약 할 수없는 경우 '='의 첫 번째 인스턴스와 일치하도록 재설정 할 수 있습니다. 내가 기지에서 벗어나지 않기를 바랍니다!

당신은 이름 값 쌍에 대한 강력한 구문 분석기가 필요하지 않으며, Regex가 충분할 것입니다. 상황에 맞는 구조 또는 중첩 구조가 없다면이 '직업'은 파서가 아닌 Lexer에 속합니다 :)

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