Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PegJS数学解析

目前,我的语法支持基本的变量赋值,我将在这个例子中使用它,但我在数学解析方面遇到了一些问题。当尝试使用以下命令时,它会正确返回:

代码语言:javascript
运行
AI代码解释
复制
test = 10^2

例如,但它返回:

代码语言:javascript
运行
AI代码解释
复制
Line 1, column 8: Expected "(", "/*", "false", "null", "true", identifier, number, string, or whitespace but "1" found.

当尝试使用以下命令时:

代码语言:javascript
运行
AI代码解释
复制
test = 10MOD2

奇怪的是,它在尝试使用时似乎工作得很好:

代码语言:javascript
运行
AI代码解释
复制
test = 10 MOD2

下面是我的语法:

代码语言:javascript
运行
AI代码解释
复制
Start
  = __ program:Program __ { return program; }

// ----- A.1 Lexical Grammar -----

SourceCharacter
  = .

WhiteSpace "whitespace"
  = "\t"
  / "\v"
  / "\f"
  / " "
  / "\u00A0"
  / "\uFEFF"

LineTerminator
  = [\n\r\u2028\u2029]

LineTerminatorSequence "end of line"
  = "\n"
  / "\r\n"
  / "\r"
  / "\u2028"
  / "\u2029"

Comment "comment"
  = MultiLineComment
  / SingleLineComment

MultiLineComment
  = "/*" (!"*/" SourceCharacter)* "*/"

MultiLineCommentNoLineTerminator
  = "/*" (!("*/" / LineTerminator) SourceCharacter)* "*/"

SingleLineComment
  = "//" (!LineTerminator SourceCharacter)*

Identifier
  = !ReservedWord name:IdentifierName { return name; }

IdentifierName "identifier"
  = head:IdentifierStart tail:IdentifierPart* {
      return {
        type: "Identifier",
        name: head + tail.join("")
      };
    }

IdentifierStart
  = UnicodeLetter

IdentifierPart
  = IdentifierStart
  / UnicodeDigit
  / "\u200C"
  / "\u200D"

UnicodeLetter
  = [a-zA-Z]

UnicodeDigit
  = [0-9]

ReservedWord
  = Keyword
  / FutureReservedWord
  / NullLiteral
  / BooleanLiteral

Keyword
  = BreakToken
  / CaseToken
  / CatchToken
  / ContinueToken
  / DebuggerToken
  / DefaultToken
  / DeleteToken
  / DoToken
  / ElseToken
  / FinallyToken
  / ForToken
  / FunctionToken
  / IfToken
  / InstanceofToken
  / InToken
  / NewToken
  / ReturnToken
  / SwitchToken
  / ThisToken
  / ThrowToken
  / TryToken
  / TypeofToken
  / VarToken
  / VoidToken
  / WhileToken
  / WithToken
  / GlobalToken
  / ModulusToken
  / QuotientToken

FutureReservedWord
  = ClassToken
  / ConstToken
  / EnumToken
  / ExportToken
  / ExtendsToken
  / ImportToken
  / SuperToken

Literal
  = NullLiteral
  / BooleanLiteral
  / NumericLiteral
  / StringLiteral

NullLiteral
  = NullToken { return { type: "Literal", value: null }; }

BooleanLiteral
  = TrueToken  { return { type: "Literal", value: true  }; }
  / FalseToken { return { type: "Literal", value: false }; }

// The "!(IdentifierStart / DecimalDigit)" predicate is not part of the official
// grammar, it comes from text in section 7.8.3.
NumericLiteral "number"
  = literal:DecimalLiteral !(IdentifierStart / DecimalDigit) {
      return literal;
    }

DecimalLiteral
  = DecimalIntegerLiteral "." DecimalDigit* {
      return { type: "Literal", value: parseFloat(text()) };
    }
  / "." DecimalDigit+ {
      return { type: "Literal", value: parseFloat(text()) };
    }
  / DecimalIntegerLiteral {
      return { type: "Literal", value: parseFloat(text()) };
    }

DecimalIntegerLiteral
  = "0"
  / NonZeroDigit DecimalDigit*

DecimalDigit
  = [0-9]

NonZeroDigit
  = [1-9]

ExponentPart
  = ExponentIndicator SignedInteger

ExponentIndicator
  = "e"i

SignedInteger
  = [+-]? DecimalDigit+

StringLiteral "string"
  = '"' chars:DoubleStringCharacter* '"' {
      return { type: "Literal", value: chars.join("") };
    }
  / "'" chars:SingleStringCharacter* "'" {
      return { type: "Literal", value: chars.join("") };
    }

DoubleStringCharacter
  = !('"' / "\\" / LineTerminator) SourceCharacter { return text(); }
  / "\\" sequence:EscapeSequence { return sequence; }
  / LineContinuation

SingleStringCharacter
  = !("'" / "\\" / LineTerminator) SourceCharacter { return text(); }
  / "\\" sequence:EscapeSequence { return sequence; }
  / LineContinuation

LineContinuation
  = "\\" LineTerminatorSequence { return ""; }

EscapeSequence
  = CharacterEscapeSequence
  / "0" !DecimalDigit { return "\0"; }

CharacterEscapeSequence
  = SingleEscapeCharacter
  / NonEscapeCharacter

SingleEscapeCharacter
  = "'"
  / '"'
  / "\\"
  / "b"  { return "\b"; }
  / "f"  { return "\f"; }
  / "n"  { return "\n"; }
  / "r"  { return "\r"; }
  / "t"  { return "\t"; }
  / "v"  { return "\v"; }

NonEscapeCharacter
  = !(EscapeCharacter / LineTerminator) SourceCharacter { return text(); }

EscapeCharacter
  = SingleEscapeCharacter
  / DecimalDigit
  / "x"
  / "u"

BreakToken      = "break"      !IdentifierPart
CaseToken       = "case"       !IdentifierPart
CatchToken      = "catch"      !IdentifierPart
ClassToken      = "class"      !IdentifierPart
ConstToken      = "const"      !IdentifierPart
ContinueToken   = "continue"   !IdentifierPart
DebuggerToken   = "debugger"   !IdentifierPart
DefaultToken    = "default"    !IdentifierPart
DeleteToken     = "delete"     !IdentifierPart
DoToken         = "do"         !IdentifierPart
ElseToken       = "else"       !IdentifierPart
EnumToken       = "enum"       !IdentifierPart
ExportToken     = "export"     !IdentifierPart
ExtendsToken    = "extends"    !IdentifierPart
FalseToken      = "false"      !IdentifierPart
FinallyToken    = "finally"    !IdentifierPart
ForToken        = "for"        !IdentifierPart
FunctionToken   = "function"   !IdentifierPart
GetToken        = "get"        !IdentifierPart
IfToken         = "if"         !IdentifierPart
ImportToken     = "import"     !IdentifierPart
InstanceofToken = "instanceof" !IdentifierPart
InToken         = "in"         !IdentifierPart
NewToken        = "new"        !IdentifierPart
NullToken       = "null"       !IdentifierPart
ReturnToken     = "return"     !IdentifierPart
SetToken        = "set"        !IdentifierPart
SuperToken      = "super"      !IdentifierPart
SwitchToken     = "switch"     !IdentifierPart
ThisToken       = "this"       !IdentifierPart
ThrowToken      = "throw"      !IdentifierPart
TrueToken       = "true"       !IdentifierPart
TryToken        = "try"        !IdentifierPart
TypeofToken     = "typeof"     !IdentifierPart
VarToken        = "var"        !IdentifierPart
VoidToken       = "void"       !IdentifierPart
WhileToken      = "while"      !IdentifierPart
WithToken       = "with"       !IdentifierPart
GlobalToken     = "global"     !IdentifierPart
ModulusToken    = "MOD"        !IdentifierPart
QuotientToken   = "DIV"        !IdentifierPart

// Skipped

___
  = (WhiteSpace / /*LineTerminatorSequence / Comment*/ MultiLineCommentNoLineTerminator)+
__
  = (WhiteSpace / LineTerminatorSequence / Comment)*

_
  = (WhiteSpace / MultiLineCommentNoLineTerminator)*

Program
  = __ body:StatementList __ {
  return {
    type: "Program",
    body: body
  }
  }

StatementList
  = (Statement)*

Statement
  = __ body:(VariableAssignment / GlobalAssignment) __
  {
  return body
  }

MathematicalExpression = additive

additive = left:multiplicative _ atag:("+" / "-") _ right:additive { return {type: "MathematicalExpression", operator: atag, left:left, right:right}; } / multiplicative 

multiplicative = left:exponential _ atag:("*" / "/" / "MOD" / "DIV") _ right:multiplicative { return {type: "MathematicalExpression", operator: atag, left:left, right:right}; } / exponential

exponential = left:primary _ atag:("^") _ right:exponential { return {type: "MathematicalExpression", operator: atag, left:left, right:right}; } / primary

primary = (DirectValueIntegerNoEq) / "(" additive:additive ")" { return additive; }


DirectValue
 = MathematicalExpression
 / Literal
 / Identifier

DirectValueInteger
 = MathematicalExpression
 / NumericLiteral
 / Identifier

DirectValueIntegerNoEq
 = NumericLiteral
 / Identifier

VariableAssignment
  = left:Identifier _ "=" _ right:DirectValue
  {
  return {
  type: "VariableAssignment",
  left: left,
  right: right
  }
  }

GlobalAssignment
  = GlobalToken ___ left:Identifier _ "=" _ right:DirectValue
  {
  return {
  type: "GlobalAssignment",
  left: left,
  right: right
  }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 23:30:21

您需要在NumericLiteral中删除!IdentifierStart。因为MOD可能是一个IdentifierStart。您的第二个示例(test = 10 MOD2)之所以有效,是因为MOD2被视为标识符,而不是MOD操作。

例如,更改以下内容:

代码语言:javascript
运行
AI代码解释
复制
// The "!(IdentifierStart / DecimalDigit)" predicate is not part of the official
// grammar, it comes from text in section 7.8.3.
NumericLiteral "number"
  = literal:DecimalLiteral !(IdentifierStart / DecimalDigit) {
      return literal;
    }

要这样做:

代码语言:javascript
运行
AI代码解释
复制
// The "!(IdentifierStart / DecimalDigit)" predicate is not part of the official
// grammar, it comes from text in section 7.8.3.
NumericLiteral "number"
  = literal:DecimalLiteral !DecimalDigit {
      return literal;
    }

输出:

代码语言:javascript
运行
AI代码解释
复制
{
   "type": "Program",
   "body": [
      {
         "type": "VariableAssignment",
         "left": {
            "type": "Identifier",
            "name": "test"
         },
         "right": {
            "type": "MathematicalExpression",
            "operator": "MOD",
            "left": {
               "type": "Literal",
               "value": 10
            },
            "right": {
               "type": "Literal",
               "value": 2
            }
         }
      }
   ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54945213

复制
相关文章
dotnet C# 获取本机外网 IP 地址
如果有自己的服务器,可以通过自己的服务器使用 asp dotnet core 服务器获取客户 IP 地址 方法,将获取的 IP 地址返回给用户
林德熙
2022/08/04
4.1K0
IP地址
IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。因此,IP协议也可以叫做“因特网协议”。
星哥玩云
2022/09/15
5.3K0
IP地址
IP地址
IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。
mcxfate
2020/08/01
4.9K0
怎么查看ip地址?什么是IP地址
电脑是我们生活中非常常见的东西,不仅是可以办公还可以上网娱乐。但是对于电脑并非是大家都知道怎么去用,有时候甚至大家连查看IP也不一定会,那么,怎么查看ip地址?下面就让小编给大家介绍吧。
用户8739990
2021/07/12
15.4K0
怎么查看ip地址?什么是IP地址
ip地址
IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。因此,IP协议也可以叫做“因特网协议”。
用户7657330
2020/08/14
4.2K0
IP地址
例如,一个大小为5000字节的数据包在穿过网络时,如果遇到一条MTU为1500字节的数据链路,即数据帧最多容纳大小为1500字节的数据包。路由器需要在数据成帧之前将数据包分段成多个数据包,其中每个数据包长度不得超过1500字节;然后路由器在每片数据包的标识字段上打上相同的标记,以便接收设备可以识别出属于一个数据包的分段。
Nujil
2023/04/12
3.5K0
【TCP/IP】IP地址分类和特殊IP地址
IP地址是因特网技术中的一个非常重要的概念,IP地址在IP层实现了底层网络地址的统一,使因特网的网络层地址具有全局唯一性和一致性。IP地址含有位置信息,反映了主机的网络连接,使因特网进行寻址和路由选择的依据。
全栈程序员站长
2022/08/12
5.2K0
【TCP/IP】IP地址分类和特殊IP地址
实用代码-C#之IP地址和整数的互转
源码 1 [StructLayout(LayoutKind.Explicit)] 2 public struct IP 3 { 4 public IP(UInt32 value) 5 { 6 this._text1 = 0; 7 this._text2 = 0; 8 this._text3 = 0; 9 this._text4 = 0; 10 this._value = value; 11
blackheart
2018/01/19
1.4K0
C# dotnet 获取整个局域网的 ip 地址
局域网可以使用的 IP 地址有很多,我写了一段代码用来枚举所有可以用的 ip 地址
林德熙
2022/08/04
1.1K0
IP地址与MAC地址
引言(有基础的同学可以不看):在复杂的网络通信中,有茫茫多的数据在中传输,它们是如何在相隔一步一步寻找到对方的呢?
比特大冒险
2023/10/17
7380
IP地址与MAC地址
ip地址查询
<?php Class IPQuery{ private static $_requestURL = 'http://ip.taobao.com/service/getIpInfo.php';
joshua317
2018/04/16
7.7K0
IP地址常识
   公有地址(Public address)由Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。
党志强
2020/02/02
3.3K0
IP地址分类
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。
用户7657330
2020/08/14
4.1K0
固定ip地址
在把皕杰报表部署到LINUX上时,我们有的时候需要自动获取ip来实现连接,但平时我们为了方便,可以把我们的ip改为固定的ip,这样访问的时候也会方便许多。
用户10133222
2022/11/09
4.5K0
​1行Python代码,获取对方的IP地址
上次我们讲过使用腾讯云DNS解析 + Github Pages,免费搭建个人网站 (给小白的保姆级教程),有一些进阶的小伙伴可能有自己的云服务器,想把域名绑定到云服务器上。
程序员晚枫
2022/06/14
1K0
​1行Python代码,获取对方的IP地址
IP地址简单介绍+查看本机IP地址-命令
IP地址:网络中设备的唯一标识 IP地址分为两大类 IPv4 给每一个连接在网络上的主机分配一个32bit(4个字节)地址 按照TCP/IP规定,IP地址用二进制来表示的,每一个IP地址长32bit(4个字节),但这样处理起来费劲,所以为了方便经常写成十进制的形式,中间使用 “·” 分隔不同的字节 这种表示法叫做:“点分十进制表示法” IPv6 由于互联网的蓬勃发展,IP地址需求量越来越大,但我们知道网络地址资源是有限的,这样使得IP的分配越来越紧张 为了扩大地址,通过IPv6重新定义地址空间,它采用的是1
用户9006224
2022/12/21
10K0
IP地址简单介绍+查看本机IP地址-命令
IP地址封装
 Java中的封装类 InetAddress,该类没有公有构造方法,调用该类必须调用它本身的静态方法。
用户2965768
2019/03/20
2.4K0
Ip地址归属地_电脑ip地址归属地查询
最近各大社交平台都悄悄上线了一个新功能,就是显示用户的IP归属地,境内精确到省级,境外精确到国家或地区。在个人信息和每条评论上面都有,也是炸出来了一波xx在xx国的账号,各大号主纷纷出视频解释自己的ip归属为什么在国内,有说用代理的,有说给家人登录的,也有说在国内有工作室(团队)的……
全栈程序员站长
2022/09/27
5K0
Ip地址归属地_电脑ip地址归属地查询
IP地址类别
一般将IP地址按计算机所在网络规模的大小分为A、B、C三类及特殊地址D、E(默认规模是根据IP地址中的第一个字段确定的)
用户7162790
2022/03/23
1.5K0
IP地址类别
ip地址判断
题目描述 输入一个ip地址串,判断是否合法。 输入描述: 输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。 接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。 输出描述: 可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。 合法的IP地址为: a、b、c、d都是0-255的整数。 输入例子: 2 255.255.255.255 512.12.2.3 输出例子: Yes! No!
张俊怡
2018/04/24
3.3K0

相似问题

.rdlc和PDF -字体水平重叠/打印时无法正确呈现

19

佐治亚字体在Windows上无法正确呈现

21

TrueType字体无法从SSRS正确呈现为pdf

11

Typekit字体Raleway无法在Windows上正确呈现

13

R无法在PDF文件中呈现小字体

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档