在搜索 Antlr 3.5 的 PHP 词法分析器语法时,从 link 获取了 Antlr 4 的语法(与 Antlr 3.5 不兼容)。
因此尝试兼容 Antlr 3.5。这些模式命令的唯一问题例如
PHP_Start
: ('<?' | '<?php' | '<?PHP') -> pushMode(PHP)
;
mode PHP;
PHP_END
: '?>' -> popMode ;
所以,我的观点是如何将这些 pushMode()、popMode() 功能转换为等效的 Antlr 3.5??
在 ANTLR 3.5 中,您可以使用堆栈模拟
pushMode()
和 popMode()
。下面是如何用 Python 实现它:
@members {
mode_stack = []
DEFAULT_MODE = 0
PHP_MODE = 1
current_mode = DEFAULT_MODE
def push_mode(self, mode):
self.mode_stack.append(self.current_mode)
self.current_mode = mode
def pop_mode(self):
if self.mode_stack:
self.current_mode = self.mode_stack.pop()
}
DEFAULT: 'default' { self.push_mode(self.PHP_MODE ) };
PHP: 'php' { self.pop_mode() };
PHP_Start
: ('<?' | '<?php' | '<?PHP') -> self.pushMode(PHP)
;
mode PHP;
PHP_END
: '?>' -> self.popMode ;