将 Antlr 4 语法转换为 Antlr 3.5

问题描述 投票:0回答:1

在搜索 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??

php antlr grammar antlr4 antlr3
1个回答
0
投票

在 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 ;
© www.soinside.com 2019 - 2024. All rights reserved.