如何使用Flex,Bison

时间:2017-02-28 20:45:14

标签: compiler-construction bison flex-lexer

我正在尝试使用Flex,Bison编写编译器,它将文件作为输入。文件包含算法行为的描述。文件有2个部分。

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

输入文件示例

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

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

我的问题是关注
文件分为两部分。我需要找出被分析的输入是否属于正确的部分。例如,寄存器 registers = {...} 的定义不应放在实体行为的定义中。

我提出了这些解决方案 1.在lex中包含正则表达式,并在开头和结尾处使用表达式。例如,行为部分以开始开头,以结束结尾。所以基本上如果我定义正则表达式,如“begin.become.end”,它应该正确解析命令只有当它位于开始和结束之间时。 2.使用每个部分的表达式定义单独的flex文件。然后读取输入文件并用一个带有表达式的flex文件解析它,并在编译器获得例如关键字 begin 之后,它将切换flex文件,其中file是解析行为的表达式。

我的问题是,如果我提出的解决方案是解决问题的好方法,或者有更优雅和正确的方法来解决此类问题。

感谢。

1 个答案:

答案 0 :(得分: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以任何顺序出现,如果有意义,或者不存在或为空(同上)。留给读者练习。