0

看看这个: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,我无法为此编写解析器语法,因为有时它们会被标记器匹配为 IDENTIFIERS。

我希望我很清楚

4

3 回答 3

3

我刚刚上传了一个适用于LRSTAR 9.1的 Verilog 语法。语法可以在此处找到的下载中找到:下载。它的语法风格比您上面提到的要新。

二元运算符应该在解析器语法中指定,而不是在词法分析器语法中。我不确定 OUTPUT_SYMBOL 的问题是什么,因为我没有使用解析器生成器分析该语法以查看冲突报告的内容。

如果 OUTPUT_SYMBOL 与 IDENTIFIER 具有相同的外观,则可以通过在符号表中进行查找来将它们与 s 区分开来。如果 OUTPUT_SYMBOL 不必放在符号表中,并且标识符之前已声明,那么简单的查找将告诉您是否有 OUTPUT_SYMBOL 或标识符。

如果您在语法中指定 OUTPUT_SYMBOL : idenfitier 并且遇到冲突,则可以将规则更改为:OUTPUT_SYMBOL : output_symbol,它可以是符号表查找返回的终端(如果在符号表中没有找到)。

不幸的是,我不熟悉 Verilog,抱歉。

于 2013-05-17T18:01:33.037 回答
0

不要使用那种语法——它很古老,而且几乎肯定是错误的。

你需要举一个具体问题的例子。lex 不需要 Verilog 的任何上下文 - 返回一个标记,并在 yacc 中对其进行排序。

于 2013-05-17T16:22:24.957 回答
0

我遇到的问题是 OUTPUT_SYMBOL 和 LEVEL_SYMBOL,我无法为此编写解析器语法,因为有时它们会被标记器匹配为 IDENTIFIERS。

是的。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) 解析器。

于 2013-05-18T05:05:26.720 回答