`
phyeas
  • 浏览: 164643 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Javascript文法之var声明 2

阅读更多

经过 rednaxelafx 的指点和本人的努力,新一版版的文法终于出来了,呵呵

这次终于让文法可以识别function。并且将上次的有递归语法改为左递归(rednaxelafx 的功劳)

又自己重写了一遍,熟悉一下思路。文法这东西确实不好写。

以下是文法文件的内容:

%{
#include "stdio.h"
%}
/*KeyWord*/
%token TYPEOF VAR FUNCTION RETURN FOR WHILE DO IF ELSE BREAK DELETE TRY CATCH IN SWITCH FINALLY NEW CASE CONTINUE THROW
/*value*/
%token __NULL__ THIS TRUE FALSE ID NUM STRING REGEX
/*relation operator*/
%token EQEQ EQEQEQ GT GE LT LE NE NEE
/*calculation operator*/
%token PLUS SUB MUL MOD DIV PLUS_EQ SUB_EQ MUL_EQ DIV_EQ MOD_EQ DPLUS DSUB
/*logiclOperator*/
%token AND OR NOT
/*other*/
%token SEMICOLON EQ POINT LPAREN RPAREN LBRACK RBRACK LBRACE RBRACE COMMA COLON
%left OR
%left AND
%right NOT
%left LT GT EQEQ LE GE NE EQEQEQ NEE
%left PLUS SUB
%left DPLUS DSUB
%right PREDPLUS
%left MUL DIV
%left POINT
%right NEGFIRST
%%
statementList:
	variableDeclareExpression
	| statementList SEMICOLON variableDeclareExpression
	|
;
variableDeclareExpression:
	VAR variableIdDeclareExpression  {printf("var declare\n");}
;
variableIdDeclareExpression:
	ID variableDeclareValueExpression
	| variableIdDeclareExpression COMMA ID variableDeclareValueExpression
;
variableDeclareValueExpression:
	EQ expression | /*nothing*/
;
expression:
	relationalExpression
	| expression OR relationalExpression
	| expression AND relationalExpression
;
relationalExpression:
	calculationExpression 
	| calculationExpression LT calculationExpression
	| calculationExpression GT calculationExpression
	| calculationExpression EQEQ calculationExpression
	| calculationExpression LE calculationExpression
	| calculationExpression GE calculationExpression
	| calculationExpression NE calculationExpression
	| calculationExpression EQEQEQ calculationExpression
	| calculationExpression NEE calculationExpression
;
calculationExpression:
	primaryExpression
	| calculationExpression PLUS primaryExpression
	| calculationExpression SUB primaryExpression
	| calculationExpression MUL primaryExpression
	| calculationExpression DIV primaryExpression
	| calculationExpression MOD primaryExpression
;
primaryExpression:
	primaryExpressionFactor
	| primaryExpressionFactor LBRACK expression RBRACK
	| primaryExpressionFactor LPAREN functionParametersExpression RPAREN
	| primaryExpressionFactor DPLUS
	| primaryExpressionFactor DSUB
;
primaryExpressionFactor:
	__NULL__
	| TRUE
	| FALSE
	| NUM
	| LPAREN expression RPAREN
	| DPLUS primaryExpressionFactor %prec PREDPLUS
	| DSUB primaryExpressionFactor %prec PREDPLUS
	| SUB primaryExpressionFactor %prec NEGFIRST
	| nonameFunctionDeclare
	| STRING
	| ID 
	| REGEX
	| primaryExpressionFactor POINT ID
	| newObjectDeclareExpression
	| newArrayDeclareExpression
;
functionParametersExpression:
	expression
	| functionParametersExpression COMMA expression
	|
;
nonameFunctionDeclare:
	FUNCTION LPAREN argumentList RPAREN LBRACE statementList RBRACE
;
newObjectDeclareExpression:
	NEW ID LPAREN functionParametersExpression RPAREN
;
newArrayDeclareExpression:
	LBRACK functionParametersExpression RBRACK
;
argumentList:
	ID
	| argumentList COMMA ID
	|
;
%%

 

分享到:
评论

相关推荐

    JavaScript运行机制浅探

    JavaScript的运行机制是其独特性的体现之一。通过理解预解析、编译过程以及执行过程,开发者可以更好地避免常见的陷阱,写出更加高效和可靠的代码。此外,深入理解这些机制对于调试和解决问题也是非常有帮助的。希望...

    前端项目-pegjs.zip

    2. 生成解析器:使用PEG.js工具将文法文件转化为JavaScript模块,这个模块包含一个解析函数。 3. 在项目中使用:将生成的解析器引入到项目中,调用解析函数处理输入字符串。 例如,你可以通过命令行工具`pegjs`来...

    random-text:使用给定的上下文无关文法生成随机文本

    Random-text使用给定的上下文无关文法生成随机文本。用法基本用法var rand = randtxt.loader().load({ 'start': '。', 'sentence': '在<place><verb>', 'subject': [ '张三', '李四', '@3 王五' ], 'place': [ '学校...

    npm-earley-cfg:在 Node.JS 中使用 Earley 算法实现上下文无关文法 (CFG)

    一个 npm 模块,包含使用 Earley 算法的上下文无关文法 (CFG) 的实现。 这是我对NPM 模块的看法,根据我的需要进行了更改。 例子 var earley = require ( 'earley-cfg' ) ; var grammar = new earley . Grammar ( ...

    js闭包详解

    JavaScript中的闭包是一种强大的语言特性,它允许函数访问和操作其词法作用域内的变量,即使在其外部作用域中调用该函数。闭包是函数及其相关的引用环境组合在一起形成的实体,它使得局部变量在函数执行完毕后依然...

    程序模型与表达_月影.pptx

    而语义则关注程序的实际行为,比如在JavaScript中的`var a = 10;`这条语句,它包含了变量声明的语法和赋值的语义。 jQuery的成功在于它提供了优秀的语法(文法)设计,如链式调用,以及良好的语义,如多态性,使得...

    SLR_Parser:基于SLR文法的四则运算解释器

    基于SLR文法的四则运算解释器 -- JS 实现演示地址: 使用方法在网页上使用首先安装gulp,nodejs与npm请自行安装 npm install -g gulp在项目目录运行 npm install再运行gulp命令,开启一个服务器 gulp打开浏览器,输入 , ...

    cfgjs:用于上下文无关文法的基本JS解析器

    CFG.js关于CFG.js允许您定义...定义语法 parser.define('e', '<num1> \\+ <num2>', function (opts) { return opts.num1 + opts.num2;});parser.define('e', '<num1> \\- <num2>', function (opts) { return opts.num1

    interpreter-preparation

    2. **变量和作用域**:JavaScript中的变量有var、let和const三种声明方式,每种都有不同的作用域规则。理解它们如何在内存中存储和访问至关重要。 3. **数据类型**:JavaScript是动态类型语言,包括基本类型(如...

    ivoire-grammar:生成语法和文本扩展。 科特迪瓦随机数生成器框架的插件

    象牙文法 生成语法和文本扩展。 随机数生成器框架的插件。 正在安装 要安装,请使用npm : npm install ivoire-grammar 或者,您可以找到源。 入门 ivoire-grammar扩展了ivoire包。 您可以直接要求它: var ...

Global site tag (gtag.js) - Google Analytics