我正在尝试解析 Verilog 语言中的标识符。完整的语法在这里。
他们可以有以下表格:
name
name[index]
name[start:stop]
name[index][start:stop]
name.(any of the above)
name[index].(any of the above)
name[index].name[index]... .name[index][start:stop]
或 EMBF 格式:
(name ([index])?)+ ([start:stop])?
这name
是大多数编程语言中的典型标识符,而index
和start
是stop
整数。
我是 yacc 的新手(我实际上正在使用 Jison),但我不确定这是否可以通过单个前瞻令牌限制来正确解释。如果name
和[
在堆栈中,则无法区分 index 和 start 之间的区别。
到目前为止,这是我的语法:
primary
: number
| hierarchical_identifier bracketted_range_expression
| hierarchical_identifier
;
primary
: number
| hierarchical_identifier
| hierarchical_identifier bracketted_range_expression
;
hierarchical_identifier
: IDENTIFIER
| IDENTIFIER '[' UNSIGNED_NUMBER ']'
| hierarchical_identifier '.' IDENTIFIER
| hierarchical_identifier '.' IDENTIFIER '[' UNSIGNED_NUMBER ']'
;
bracketted_range_expression
: '[' range_expression ']';
range_expression
: UNSIGNED_NUMBER ':' UNSIGNED_NUMBER
这会产生几个 shift/reduce 和 reduce/reduce 错误,它根本不想解析 line foo[1:0]
。它期望 a]
代替:
. 有什么办法可以解决这个问题?