当前位置:  开发笔记 > 后端 > 正文

如何正确解析VB Case语句?

如何解决《如何正确解析VBCase语句?》经验,为你挑选了0个好方法。

我正在尝试解析VBA代码,规范的5.4.2.10部分定义了Select Case语句,我们已经定义如下:

// 5.4.2.10 Select Case Statement
selectCaseStmt :
    SELECT whiteSpace? CASE whiteSpace? selectExpression endOfStatement
    caseClause*
    caseElseClause?
    END_SELECT
;
selectExpression : expression;
caseClause :
    CASE whiteSpace rangeClause (whiteSpace? COMMA whiteSpace? rangeClause)* endOfStatement block
;
caseElseClause : CASE whiteSpace? ELSE endOfStatement block;
rangeClause :
    expression
    | selectStartValue whiteSpace TO whiteSpace selectEndValue   
    | (IS whiteSpace?)? comparisonOperator whiteSpace? expression
;
selectStartValue : expression;
selectEndValue : expression;

问题是expressionin rangeClause优先,并使这个:

Select Case foo
    Case Is = 42
        Exit Sub
End Select

...最终被拾起并视为{undeclared-variable} {EQ} {literal},这是一个问题,因为Is应该是词法分析器,而不是比较表达式的LHS:

expression whiteSpace? (EQ | NEQ | LT | GT | LEQ | GEQ | LIKE | IS) whiteSpace? expression    # relationalOp

我尝试重新排序替代方案,以便expression分支具有较低的优先级,如下所示:

rangeClause :
    selectStartValue whiteSpace TO whiteSpace selectEndValue   
    | (IS whiteSpace?)? comparisonOperator whiteSpace? expression
    | expression
;

但是这打破了整个语法的各种方式(在我的项目中打破了~1000次测试),所以我尝试将其rangeClause更改为此(删除了可选的令牌,因为Is没有=实际上是非法的VBA代码):

rangeClause :
      expression (whiteSpace TO whiteSpace expression)?                 #caseFromTo
    | (IS whiteSpace comparisonOperator whiteSpace)? expression         #caseIs
;

然后在代码中使用CaseFromToContextCaseIsContext编写类(必须,以保持编译),但它又在我的项目中破坏了~1000次测试.

然后我想,"嘿,这可能是模棱两可的!" 把它变成了这个:

rangeClause :
      expression whiteSpace TO whiteSpace expression                    #caseFromTo
    | IS whiteSpace comparisonOperator whiteSpace expression            #caseIs
    | expression                                                        #caseExpr
;

......但没有运气,同样的结果.

如何rangeClause理解这种烦人的Case Is = foobar语法?我正在使用ANTLR 4.3,但我们计划很快升级到ANTLR 4.6.

如果需要其他上下文,则完整的VBAParser.g4语法在github上.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有