我们正在努力将Antlr VB6 grammar扩展到涵盖LotusScript。
LotusScript具有一些与VB无关的功能。我试图让我的语法理解像这样的东西:
x = Inputbox("How Happy are you")
y = Inputbox("Number", "Enter any number", "0")
我尝试添加语法:
inputboxStmt
: INPUTBOX WS? argList
;
INPUTBOX
: I N P U T B O X
;
vb6 Grammar中的现有定义:
argList
: LPAREN (WS? arg (WS? COMMA WS? arg)*)? WS? RPAREN
;
arg
: (OPTIONAL WS)? ((BYVAL | BYREF) WS)? (PARAMARRAY WS)? ambiguousIdentifier typeHint? (WS? LPAREN WS? RPAREN)? (WS asTypeClause)? (WS? argDefaultValue)?
;
WS
: [ \t\u000C] +
;
但是,当我解析上面的代码时,出现类似以下错误:
line 5:14 no viable alternative at input '\nDim nstr As String\n x = Inputbox("How Happy are you"'
line 5:14 no viable alternative at input '\n x = Inputbox("How Happy are you"'
line 5:14 mismatched input '"How Happy are you"' expecting { [long list of keywords]}
line 6:16 mismatched input '"Number"' expecting {[same long list of keywords] }
line 6:26 mismatched input '"Enter any number"' expecting <EOF>
我在这里想念什么?
您收到的错误主要是由于不允许使用字符串作为参数。 arg
规则的主要部分是ambiguousIdentifier
,其定义为:
ambiguousIdentifier
: (IDENTIFIER | ambiguousKeyword) +
| L_SQUARE_BRACKET (IDENTIFIER | ambiguousKeyword) + R_SQUARE_BRACKET
;
您会看到只有标识符,某些关键字(也称为非保留关键字)以及允许的内容周围的可选方括号。这就是Visual Basic reference实际上允许使用的参数名称。为了使您的用例可行,也将所有*LITERAL
令牌也添加到此规则中。
这里还引起关注的是加号运算符。为什么要允许多个标识符为一个?基本语言真的允许吗?