2017-02-28 50 views
0

我正在尝试使用Flex,Bison编写编译器,它将文件作为输入。文件包含算法行为的描述。文件有2个部分。如何使用Flex,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 

实施例被划分成两个部分。我需要找出是否输入分析属于正确的部分。例如,定义寄存器寄存器= {...}不应放置在实体行为的定义中。

我想出了这些解决方案。
1.在开始和结束时用lex将lex中的正则表达式包装起来。例如,具有行为的部分从开始开始并以结束结束。所以基本上,如果我定义像“begin.become.end”这样的正则表达式,它应该正确解析命令,只有当它位于开始和结束之间。
2.用每个部分的表达式定义单独的柔性文件。之后读取输入文件并用一个带表达式的flex文件解析它,然后编译器得到例如关键字begin它将切换文件的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

感谢您的答案。 –