我想解析Smalltalk。
通常在表达式序列中,它们需要介于两者之间的 PERIOD 标记 (.( 作为分隔符,就像 java 中的 ';" 一样。 表达式本身不需要句点。 因此,我在表达式规则中匹配此句点:
expressions : expression (PERIOD expression)*;
并且特定表达式的不同子规则本身与 PERIOD 不匹配。
但是,有一种特殊类型的表达式调用本机库:<primitive: ABC>
当这后面跟着另一个表达式时,令人惊讶的是不需要句点。
如何处理这种情况?
也许注入一个句号。在"原始"规则中,告诉词法分析器接下来注入 PERIOD 令牌。但是怎么做呢?
或者这种情况有更好的解决方案吗?
弗兰克
也许是这样的:
expressions
: start_expression* expression '.'?
;
start_expression
: expression '.'
| pragma
;
expression
: assignment
| pragma
;
assignment
: ID ':=' NUMBER
;
pragma
: '<' ID ':' ID '>'
;