基准跳过评论“#;”同时使用ANTLR4为R6RS创建解析器

时间:2013-04-23 12:41:08

标签: antlr4 r6rs

我正在尝试为R6RS编写词法分析器/解析器,而我仍然坚持使用基准跳过注释

以下是我的词法分析器/解析器规则的一部分:

BOOLEAN: '#t' | '#f' | '#T' | '#F';
NUMBER: DIGIT+; // TODO: incomplete
CHAR: '#\\' CHARNAME | '#\\x' HEXDIGIT+ | '#\\' . ;
STRING: '"' STRELEMENT* '"';
IDENTIFIER: INITIAL SUBSEQUENT* | PERCULIAR_ID;

COMMENT: (';' .*? LINE_ENDING | '#!r6rs' ) -> skip;
NESTED_COMMENT: '#|' (NESTED_COMMENT | ~[#|] | ('|' ~'#') | ('#' ~'|') )* '|#' -> skip;

datum: lexemeDatum
     | compoundDatum;
compoundDatum: list
             | vector
             | bytevector;

// (rest omitted...)

现在,我想写一下skipDatum: '#;' datum -> skip。不幸的是,解析器规则不允许->skipSKIPDATUM: '#;' datum -> skip都不起作用,因为词法分析器规则不能引用解析器规则。

在我看来,虽然“评论”是词法分析员的责任,而“构建数据”是解析器的责任,关于#;的规则需要两者。

这是我目前的解决方案:

skipDatum: '#;' datum;

list: '(' (datum|skipDatum)* ')' #ProperListDatum
    | '[' (datum|skipDatum)* ']' #ProperListDatum
    | '(' skipDatum* datum (datum|skipDatum)* '.' skipDatum* datum skipDatum* ')' #ImproperListDatum
    | '[' skipDatum* datum (datum|skipDatum)* '.' skipDatum* datum skipDatum* ']' #ImproperListDatum

虽然它正在工作,但它看起来很难看;我真的想用datum编写规则,我总是写得像skipDatum* datum skipDatum*

有没有更好的解决方案?提前谢谢。

1 个答案:

答案 0 :(得分:0)

你可以使用这样的东西。

datum
    :   SKIP_DATUM? ...
    ;

SKIP_DATUM : '#;';

这将要求您每次在生成的代码中使用DatumContext时执行以下检查,同时简化语法。

if (ctx.SKIP_DATUM() != null) {
    // handle skipped datum here (return?)
}