经过 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的运行机制是其独特性的体现之一。通过理解预解析、编译过程以及执行过程,开发者可以更好地避免常见的陷阱,写出更加高效和可靠的代码。此外,深入理解这些机制对于调试和解决问题也是非常有帮助的。希望...
2. 生成解析器:使用PEG.js工具将文法文件转化为JavaScript模块,这个模块包含一个解析函数。 3. 在项目中使用:将生成的解析器引入到项目中,调用解析函数处理输入字符串。 例如,你可以通过命令行工具`pegjs`来...
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打开浏览器,输入 , ...
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
2. **变量和作用域**:JavaScript中的变量有var、let和const三种声明方式,每种都有不同的作用域规则。理解它们如何在内存中存储和访问至关重要。 3. **数据类型**:JavaScript是动态类型语言,包括基本类型(如...
象牙文法 生成语法和文本扩展。 随机数生成器框架的插件。 正在安装 要安装,请使用npm : npm install ivoire-grammar 或者,您可以找到源。 入门 ivoire-grammar扩展了ivoire包。 您可以直接要求它: var ...