파서 생성기 (Antlr, YACC 등)에서 이름 = 값 쌍 목록을 구문 분석하려면 어떻게해야합니까?
-
23-08-2019 - |
문제
나는 (공백 분리 된) 쌍의 목록을의 형태로 구문 분석하고 싶습니다.
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에 속합니다 :)
제휴하지 않습니다 StackOverflow