经过几个小时的努力,文法文件貌似终于工作正常了。文法定义的是一个js变量声明语句的文法,以此来学习文法的定义和使用。
测试输入:
var s=123; var s="sadasd"; var s=(1); var s=1+3*5; var s=1+3+5; var s=s.p; var s=s[1]; var s=s==s; var s=!s; var p=p.point(); var p=p.point()-1; var a=new Array(); var a=ss=s=d; var regex=/avc/; var a=ss=s; var a=ss.x=s;
这些输入均测试通过。
文法如下:
stmtList:
| stmtList varDecl
;
varDecl:
VAR ID EQ expression EXPR_END {$$=$4;printf("$$ is %d, id is %s\n", $$,$2);}
;
expression:
assignmentExpression
| logicalOrExpression
| REGEX
;
assignmentExpression:
variableAccess EQ expression
;
logicalOrExpression:
logicalAndExpression logicalOrExpressionRight
;
logicalOrExpressionRight:
OR logicalAndExpression
|
;
logicalAndExpression:
relationalExpression logicalAndExpressionRight
;
logicalAndExpressionRight:
AND relationalExpression logicalAndExpressionRight
|
;
relationalExpression:
additiveExpression relationalExpressionRight
| NOT relationalExpression
;
relationalExpressionRight:
relationalOperator additiveExpression
|
;
additiveExpression:
multiplicativeExpression additiveExpressionRight
;
additiveExpressionRight:
additiveOperator multiplicativeExpression additiveExpressionRight
|
;
multiplicativeExpression:
primaryExpression multiplicativeExpressionRight
;
multiplicativeExpressionRight:
multiplicativeOperator primaryExpression multiplicativeExpressionRight
|
;
primaryExpression:
variableAccess
| NUM
| STRING
| LPAREN expression RPAREN
| SUB primaryExpression
| functionCallExpression
| newObjectExpression
;
functionCallExpression:
variableAccess LPAREN paramsExpression RPAREN
;
paramsExpression:
logicalOrExpression paramsExpressionRight
|
;
paramsExpressionRight:
COMMA paramsExpression
|
;
newObjectExpression:
NEW functionCallExpression
;
variableAccess:
ID
| ID POINT ID
| ID LBRACK expression RBRACK
;
relationalOperator:
LT | GT | EQEQ | LE | GE | NE | EQEQEQ | NEE
;
additiveOperator:
PLUS | SUB
;
multiplicativeOperator:
MUL | DIV
;
文法中参考了rednaxelafx在《一个简单的语言的语法(一):用ANTLR描述语法 》中的一些文法修改得到
还差描述var a=function(){}的文法,由于时间关系就先不写了。明天补全。。