首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ANTLR4为R6RS制作解析器时跳过注释"#;“

使用ANTLR4为R6RS制作解析器时跳过注释"#;“
EN

Stack Overflow用户
提问于 2013-04-23 20:41:08
回答 1查看 60关注 0票数 0

我正在尝试为R6RS编写词法分析器/解析器,但我被跳过数据的注释卡住了

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

代码语言:javascript
复制
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一样编写代码。不幸的是,解析器规则不允许使用->skip。这两个SKIPDATUM: '#;' datum -> skip都不能工作,因为词法分析器规则不能引用解析器规则。

在我看来,虽然“注释掉”是词法分析器的责任,“构造数据”是解析器的责任,但是关于#;的规则需要两者。

这是我目前的解决方案:

代码语言:javascript
复制
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*一样编写

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 21:16:01

你可以用到这样的东西。

代码语言:javascript
复制
datum
    :   SKIP_DATUM? ...
    ;

SKIP_DATUM : '#;';

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

代码语言:javascript
复制
if (ctx.SKIP_DATUM() != null) {
    // handle skipped datum here (return?)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16169619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档