我正在尝试使用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是解析行为的表达式。
我的问题是,如果我提出的解决方案是解决问题的好方法,或者有更优雅和正确的方法来解决此类问题。
感谢。
答案 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'.
如果错误的部分出现任何内容,则会导致语法错误。
您可能希望允许registers
和states
以任何顺序出现,如果有意义,或者不存在或为空(同上)。留给读者练习。