2017-02-28 10 views
0

파일을 입력으로 사용하는 Bison Flex를 사용하여 컴파일러에서 작성하려고합니다. 파일에는 알고리즘 동작에 대한 설명이 들어 있습니다. 파일에는 2 개의 섹션이 있습니다.다른 섹션으로 입력을 올바르게 구문 분석하는 방법 Bison

registers = {state, temp,input} 
states = {idle, done} 

entity 
    begin 
     read(input) 
     temp = input 
     send(temp) 
     become done 
    end 

내 문제가
파일 다음되는 입력 파일의

1. definition of registers, states 
2. description of behavior 

예는 두 개의 섹션으로 나누어 져 있습니다. 분석 된 입력이 올바른 섹션에 속하는지 알아야합니다. 예를 들어 레지스터 정의는 다음과 같습니다. registers = {...}은 엔티티의 비헤이비어 정의에 포함되어서는 안됩니다.

나는 이러한 해결책을 생각해 냈습니다.
1. 정규 표현식을 lex로 시작과 끝 부분의 표현식으로 둘러 쌉니다. 예를 들어, 동작이있는 섹션은 으로 시작하고으로 시작하고 으로 끝납니다. 그래서 기본적으로 "begin.become.end"와 같은 정규 표현식을 정의하면이 올바르게 시작되어야합니다. 시작과 끝 사이에있을 때만 올바르게 명령을 구문 분석해야합니다.
2. 모든 섹션에 대해 표현식이있는 별도의 플렉스 파일을 정의하십시오. 그 다음에 입력 파일을 읽고 표현식이있는 하나의 flex 파일로 구문 분석하고 컴파일러가 예를 들어 이라는 키워드로 시작하면으로 시작합니다.이 파일은 구문 분석 동작에 대한 표현식이있는 파일에 대해 flex 파일을 전환합니다.

제 질문은 제 제안 된 솔루션이 문제에 접근하는 좋은 방법인지 또는이 유형의 문제를 해결하기 위해보다 우아하고 올바른 방법이 있는지 제 질문입니다.

감사합니다.

+0

@downvoter 설명해주십시오. – EJP

답변

2

아니요. 이것을 위해 렉서를 사용하지 않아도됩니다. 문법에서 모두 정의하십시오. 그것이 바로 그 때문입니다.

program 
    : registers states entities 
    ; 

registers 
    : REGISTERS '{' register_list '}' 
    ; 

register_list 
    : register 
    | register_list ',' register 
    ; 

// similarly for states 

entities 
    : entity 
    | entities entity 
    ; 

entity 
    : ENTITY BEGIN entity_stuff END 
    ; 

// etc, whatever entity_stuff can be, not including 'registers' or 'states'. 

잘못된 부분에 아무 것도 나타나면 구문 오류가 발생합니다.

registersstates이 의미가있는 경우 또는 부재중이거나 비어있는 경우 (위도 표시) 허용 할 수도 있습니다. 독자를위한 운동으로 남았습니다.

+1

답변 해 주셔서 감사합니다. –