Antrl4解析器语法测试隐藏的通道令牌



我想在跳过所有其他CPP语法时解析CPP预处理指令。特别是,我需要区分诸如宏和对象之类的函数:

# define abc(x,y) x##y  //function like macro & token pasting operator
# define abc (a,b,c)   //object like macro, replace 'abc' by '(a,b,c)'

关键区别在于,像宏一样的函数在标识符abc和左侧括号之间没有任何隐藏令牌(Whitespace或多行注释)。

但是问题是,我已经将所有多行论和淡水空间放在隐藏的频道中。那么如何在左括号之前识别空格?

我尝试过的Lexer语法是这样的:

CRLF: 'r'? 'n' -> channel(LINEBREAK);
WS: [ tf]+ -> channel(WHITESPACE);
ML_COMMENT: '/*'  .*? '*/' -> channel(COMMENTS);
SL_COMMENT: '//' ~[rn]*  -> channel(COMMENTS); 
PPHASH: {getCharPositionInLine() == 0}? (ML_COMMENT | [ tf])* '#'
; //any line starts with a # as the first char (comments, ws before it skipped)
CHARACTER_LITERAL : 'L'? ''' (CH_ESC |~['rn\])*? ''' ;  //not exactly 1 char between '' e.g. '0x05'
fragment CH_ESC :  '\' . ;
STRING_LITERAL: 'L'? '"' (STR_ESC | ~["rn\])*? '"'  ;
fragment STR_ESC:  '\'  .  ;
ANY_ID: [_0-9a-zA-Z]+ ;
ALL_SYMBOL:
  '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '=' | '-' | '+' | '\'| '|' | ':' | ';' | '"' | '''|
  '<' | '>' | '.' | '?' | '/' | ',' | '[' | ']' | '(' | ')' | '{' | '}'
; //basically everything found in a keyboard

我打算告诉解析器,由pphash代币开始了预处理指令的开始。这是一条线开始时的"#"。

我的不正确的解析器语法#define行:

define_line:
  PPHASH 'define'  (function_like_define | object_like_define)
;
//--- function like define ---
function_like_define:
  ANY_ID '(' parameter_seq? ')'  fl_replacement_string
;
parameter_seq:  ANY_ID ( ',' ANY_ID)* ;
//--- object like define ---
object_like_define:
  ANY_ID ol_replacement_string
;
//fl&ol different names, visitor no need to test parent. Separate rule to make it a single node supporting getText()
fl_replacement_string: any_non_crlf_token*;
ol_replacement_string: any_non_crlf_token*;
any_non_crlf_token:ANY_ID | .....;

此语法错误地将#define abc (a,b,c)视为像宏一样的函数。如何修复语法?

带有所有铃铛和哨子的解析预处理器令牌(跳过任何禁用的东西,线剪接,宏观处理,串行,滚动,召唤和所有这些)并不是一般解析器的任务。您应该实现自己的输入流来处理预处理器宏(涉及条件的表达解析器)。然后,此流将评估在读取输入时启用的内容,然后跳过它,直到找到 #else #endif #if / #ifdef 是基于行的,因此您可以通过逐行阅读来轻松执行此操作。

我几年前已经完成了这个过程,并免费下载我的主页上的结果:http://www.soft-gems.net/index.php/java/windows-resource-resource-file-parser-------conterter。该项目是Windows .rc 文件的解析器,但是由于其性质,完全实现了 .h 文件parser 表达式评估器,宏扩展等。

最新更新