看看这个:http://www.verilog.com/VerilogBNF.html
UNARY_OPERATOR和BINARY_OPERATOR作为令牌重叠。OUTPUT_SYMBOL和LEVEL_SYMBOL也是如此。我相信还有其他人。
我的记号赋予器(lex)没有任何上下文,不知道它应该返回UNARY_OPERATOR还是BINARY_OPERATOR。
如果这些标记(UNARY_OPERATOR和BINARY_OPERATOR)没有被lex规则标记,我可以将它们写入解析器(yacc)语法中。
我遇到的问题是OUTPUT_SYMBOL和LEVEL_SYMBOL,我不能为此编写解析器语法,因为有时记号赋予器将匹配为标识符。
我希望我说清楚了
发布于 2013-05-18 02:01:33
我刚刚上传了一个Verilog语法,它在LRSTAR 9.1上工作得很好。语法可以在这里的下载中找到:downloads。它是用一种比你上面提到的语法风格更新的语法风格编写的。
二元运算符应该在解析器语法中指定,而不是在词法分析器语法中指定。我不确定OUTPUT_SYMBOL的问题出在哪里,因为我还没有使用解析器生成器分析该语法来查看冲突报告所说的内容。
如果OUTPUT_SYMBOL与标识符具有相同的外观,则有一种方法可以通过在符号表中进行查找来将它们与s区分开来。如果不必将OUTPUT_SYMBOLs放在符号表中,并且标识符是先前声明的,那么简单的查找就会告诉您是OUTPUT_SYMBOL还是标识符。
如果您在语法中指定了OUTPUT_SYMBOL : OUTPUT_SYMBOL并得到冲突,那么您可以将规则更改为:OUTPUT_SYMBOL: output_symbol,它可以是符号表查找返回的终端(如果在符号表中找不到它)。
不幸的是,我不熟悉Verilog,抱歉。
发布于 2013-05-18 00:22:25
不要使用这种语法--它很古老,而且几乎肯定是错误的。
你需要举一个具体问题的例子。lex不需要Verilog的任何上下文-返回一个令牌,并在yacc中对其进行排序。
发布于 2013-05-18 13:05:27
我遇到的问题是OUTPUT_SYMBOL和LEVEL_SYMBOL,我不能为它写解析器语法,因为有时候会被标记器作为标识符进行匹配。
是。UDP表条目可能包含标识符和数字。您需要创建一系列规则,如下所示:
udp_seq_table_entry :
udp_table_prefix+ COLON table_element COLON table_element SEMICOLON;
udp_table_prefix :
table_element
| edge_indicator;
edge_indicator :
LPARAN table_element
(
table_element RPARAN // X?, ?X, 1b,... two tokens
| RPARAN // xB, xX, B1,... one token
);
table_element :
DECIMALNUMBER | IDENTIFIER | '-' | '?' | '*';然后,您的工具必须检查标识符和数字,以确保它们在解析后只包含正确的字符。
我不会简单地将Verilog EBNF传递给解析器生成器。有些东西,比如module_instantiation和udp_instantiation,可能要在设计精化之后才能区分。我从来没有用过它,但是Verilog-Perl有一个Verilog(1364-2005)解析器。
https://stackoverflow.com/questions/16613587
复制相似问题