축소 된 구문 구문에 대한 문법을 연구하고 중첩 된 확장이있는 걸림돌을 만났습니다.구문 분석을 사용하여 구문 분석 확장 구문
$(error Not implemented for this OS: $(filter XYZ_OS_%, $(.VARIABLES)))
이 많은 사람들이 함께 투쟁하는 것 중첩 된 표현의 문제에 대한 변형은 다음과 같습니다
는 여기에 우리가 구문 분석 할 작업의 예입니다. 중첩 된 표현 괄호 달러를 포함한 자유 형식 문자열을 포함 할 수 있기 때문에 약간 더 어려운 : (. $
문자가 여기에 반복하여 이스케이프)
$(error Something went wrong (you owe me $$$$$$.))
을
내가 이것에 대한 예비 문법을 가지고 있지만,text
규칙을 정의하는 방법을 생각할 수 없습니다.
name = Word(alphanums + '_')
text = CharsNotIn('$)') # This does not work generally.
expansion = Suppress('$(') + name + Suppress(')')
sub_expression = Forward()
expression = ZeroOrMore(sub_expression)
error = Suppress('$(error ') + expression + Suppress(')')
info = Suppress('$(info ') + expression + Suppress(')')
pattern = Word(alphanums + '._%')
filter = Suppress('$(filter ') + pattern + Suppress(',') + expression + Suppress(')')
sub_expression << (text | error | filter | info | expansion)
# This accepts all kinds of invalid Make syntax,
# but is useful for testing line-by-line.
test_grammar = OneOrMore(text | expansion | error | filter | info)
이것은 단순한 사례를 포착했지만 확장에 속하지 않은 괄호와 달러는 실패합니다.
아이디어가 있으십니까? 감사!
일반 변수 확장과 마찬가지로'error','filter' 등을 처리해야한다고 생각합니다. –
@Antti, 고마워. 나는 우리가 같은 결론에 도달했다고 생각한다. 불행히도 텍스트 내용을 확장에서 분리하는 데 도움이되지 않는 것 같습니다. –
그게 바로 주석입니다 ... 당신은 어떻게 확장을 먼저 구문 분석하고, 그런 식으로 쉽게 복제하는지 알아 내야합니다. –