要标记终端或将它们写入解析器语法?

时间:2013-05-17 16:10:15

标签: parsing tokenize verilog yacc lex

看看这个:http://www.verilog.com/VerilogBNF.html

UNARY_OPERATOR和BINARY_OPERATOR重叠为令牌。 OUTPUT_SYMBOL和LEVEL_SYMBOL也是如此。我确定还有其他人。

我的tokenizer(lex)没有任何上下文,也不知道它是否应该返回UNARY_OPERATOR或BINARY_OPERATOR。

如果它们没有被lex规则标记,我可以将这些标记(UNARY_OPERATOR& BINARY_OPERATOR)写入解析器(yacc)语法。

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

我希望我能清楚

3 个答案:

答案 0 :(得分:3)

我刚刚上传了一个与LRSTAR 9.1一起使用的Verilog语法。语法可以在下面的下载中找到:downloads。它是用比上面提到的语法风格更新的语法风格编写的。

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

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

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

不幸的是,我不熟悉Verilog,对不起。

答案 1 :(得分:0)

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

您需要举例说明具体问题。 lex不需要Verilog的任何上下文 - 返回一个令牌,并在yacc中对其进行排序。

答案 2 :(得分:0)

  

我遇到的问题是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)解析器。