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

问题描述:

看一看:http://www.verilog.com/VerilogBNF.html标记终端或将它们写入解析器语法?

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

我的分词(法)没有任何背景,不知道它是否应该返回UNARY_OPERATOR或BINARY_OPERATOR。

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

我遇到的问题是使用OUTPUT_SYMBOL和LEVEL_SYMBOL,我无法为此编写解析器语法,因为有时会由标记器将其作为IDENTIFIERS进行匹配。

我希望我清楚

不要使用语法 - 这是古老的,而且几乎肯定将是错误的。

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

我刚刚上传了Verilog的语法与LRSTAR 4.0工作正常。语法可以在下载中找到:http://lrtec.com/lrstar。它的写法比上面引用的语法风格更新。

二进制运营商应该在语法(语法分析器)来处理,而不是词法分析器。我不知道 问题是OUTPUT_SYMBOL什么,可是,因为我还没有分析说,与语法解析器 发生器看到冲突报告所说的话。

如果OUTPUT_SYMBOL与IDENTIFIER具有相同的外观,可以通过在符号表中进行查找来区分 它们与s。如果OUTPUT_SYMBOLs没有 被放在符号表和标识符先前声明,然后进行简单的查找 会告诉你是否有一个OUTPUT_SYMBOL或标识符。

如果您在语法OUTPUT_SYMBOL注明:idenfitier,你会得到一个冲突,那么你可以 改变规则:OUTPUT_SYMBOL:output_symbol,可以在终端由 符号表中查找返回(如果没有找到在符号表中)。

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

+0

谢谢!!!!!! – sigflup

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