经过几个小时的努力,文法文件貌似终于工作正常了。文法定义的是一个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(){}的文法,由于时间关系就先不写了。明天补全。。
分享到:
相关推荐
JavaScript的运行机制是其独特性的体现之一。通过理解预解析、编译过程以及执行过程,开发者可以更好地避免常见的陷阱,写出更加高效和可靠的代码。此外,深入理解这些机制对于调试和解决问题也是非常有帮助的。希望...
PEG.js(Parslet Expression Grammar for JavaScript)允许开发者通过定义文法来生成解析器,这个文法是基于派生式的(parsing expression grammar)。这种解析器可以理解并解析特定格式的数据,如编程语言、配置...
Random-text使用给定的上下文无关文法生成随机文本。用法基本用法var rand = randtxt.loader().load({ 'start': '。', 'sentence': '在<place><verb>', 'subject': [ '张三', '李四', '@3 王五' ], 'place': [ '学校...
一个 npm 模块,包含使用 Earley 算法的上下文无关文法 (CFG) 的实现。 这是我对NPM 模块的看法,根据我的需要进行了更改。 例子 var earley = require ( 'earley-cfg' ) ; var grammar = new earley . Grammar ( ...
JavaScript中的闭包是一种强大的语言特性,它允许函数访问和操作其词法作用域内的变量,即使在其外部作用域中调用该函数。闭包是函数及其相关的引用环境组合在一起形成的实体,它使得局部变量在函数执行完毕后依然...
而语义则关注程序的实际行为,比如在JavaScript中的`var a = 10;`这条语句,它包含了变量声明的语法和赋值的语义。 jQuery的成功在于它提供了优秀的语法(文法)设计,如链式调用,以及良好的语义,如多态性,使得...
基于SLR文法的四则运算解释器 -- JS 实现演示地址: 使用方法在网页上使用首先安装gulp,nodejs与npm请自行安装 npm install -g gulp在项目目录运行 npm install再运行gulp命令,开启一个服务器 gulp打开浏览器,输入 , ...
2. **变量和作用域**:JavaScript中的变量有var、let和const三种声明方式,每种都有不同的作用域规则。理解它们如何在内存中存储和访问至关重要。 3. **数据类型**:JavaScript是动态类型语言,包括基本类型(如...
实例化解析器 var Parser = require('./parser');var parser = new Parser();解析器导出一个类。 只需实例化它即可获得一个新的解析器。定义语法 parser.define('e', '<num1> \\+ <num2>', function (opts) { return...
象牙文法 生成语法和文本扩展。 随机数生成器框架的插件。 正在安装 要安装,请使用npm : npm install ivoire-grammar 或者,您可以找到源。 入门 ivoire-grammar扩展了ivoire包。 您可以直接要求它: var ...