标签: pegjs

使用PEG.js简单解析问题

我试图通过在PEG.js操场上输入简单的语法来绕过PEG .

例1:

  • 输入: "abcdef1234567ghijklmn8901opqrs"
  • 期望的输出: ["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]

  • 实际产量: ["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]

这个例子非常有效,但是我可以让PEG.js不将生成的数组嵌套到百万级别吗?我假设诀窍是使用concat()而不是join()某个地方,但我找不到这个地方.

start
  = Text

Text
  = Numbers Text
  / Characters Text
  / EOF

Numbers
  = numbers: [0-9]+ {return numbers.join("")}

Characters
  = text: [a-z]+ {return text.join("")}

EOF
  = !.
Run Code Online (Sandbox Code Playgroud)

例2:

与示例1相同的问题和代码,但将字符规则更改为以下内容,我预期会产生相同的结果.

Characters
  = text: (!Numbers .)+ {return text.join("")}
Run Code Online (Sandbox Code Playgroud)

结果输出是:

[",a,b,c,d,e,f", ["1234567", [",g,h,i,j,k,l,m,n", ["8901", [",o,p,q,r,s", ""]]]]]
Run Code Online (Sandbox Code Playgroud)

为什么我得到所有这些空的比赛?

例3:

最后一个问题.这根本不起作用.我怎样才能使它工作?对于奖励积分,任何关于效率的指针?例如,如果可能,我应该避免递归吗?

我也很欣赏一个很好的PEG教程的链接.我已阅读(http://www.codeproject.com/KB/recipes/grammar_support_1.aspx),但正如您所见,我需要更多帮助......

  • 输入: 'abcdefghijklmnop"qrstuvwxyz"abcdefg'
  • 期望的输出: ["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"] …

javascript parsing peg pegjs

21
推荐指数
1
解决办法
6434
查看次数

从PEG.js语法生成TextMate语言语法

有没有一种工具可以将PEG.js语法翻译成TextMate语法?

我正在构建自己的语言,并希望在我的首选编辑器TextMate中使用语法高亮显示.我语言的语法是用PEG.js构建的.根据此用例的 TextMate文档,我必须以与PEG.js不兼容的形式编写TextMate语法.

我开始编写一个新的TextMate语法,但我很快注意到翻译整个语法需要很长时间,甚至是与可接受的语法高亮相关的子集.由于我非常懒惰而且不想做所有这些繁琐的工作,我想到了自动完成这项任务.

谁能给我任何线索如何自动化,或者至少加速从PEG.js语法生成TextMate语法?

grammar textmate syntax-highlighting peg pegjs

16
推荐指数
1
解决办法
1242
查看次数

TS2307:找不到模块或其相应的类型声明

我有一个my-parser-generator使用pegjs的私有 GitHub 存储库。所有底层逻辑都用 TypeScript 编写,然后编译并输入到pegjs,生成最终的解析器。

然后这个 repo a 被用作另一个私有 repo 中的包依赖项parser-consumer,它是用 TypeScript 编写的(使用--declaration选项编译)。所以my-parser-generator基本上是向 TypeScript 使用者提供 JavaScript 文件。

但是当我尝试导入新生成的解析器时,出现以下错误: TS2307: Cannot find module 'my-parser-generator' or its corresponding type declarations

我已经尝试了互联网上的大部分解决方案,但没有一个对我有用

我的解析器生成器

package.json(省略了大部分行)

{
  "private": true,
  "version": "0.4.9",
  "name": "my-parser-generator",
  "files": [
    "dist/lib/**/*.js",
    "dist/excel.browser.js",
    "dist/**/*.d.ts",
    "dist/**/*.js.map"
  ],
 "main": "dist/excel.browser.js",
 "typings": "dist/index.d.ts",
 "type": "module",
 "dependencies": {
   "pegjs": "^0.11.0-master.b7b87ea"
 }
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
  "compilerOptions": {
    "target": "es2019",
    "allowJs": true,
    "skipLibCheck": true, …
Run Code Online (Sandbox Code Playgroud)

json github node-modules pegjs typescript

15
推荐指数
1
解决办法
7万
查看次数

配置Karma以使用requirejs加载pegjs

尝试使用PegJS和requirejs测试项目.我有几个源文件,实现为AMD模块(定义),通过require API加载.目录结构下面:

js/
   somefile.js
   main.js
   parser.js
test/
   parser.spec.js
Run Code Online (Sandbox Code Playgroud)

我编写了一个parser.js模块来加载PegJS语法文件并使用PegJS创建一个peg解析器:

define(function() {
  'use strict';

  var PEG = require('pegjs');
  var grammarFile = 'grammar.peg'

return {
  parse: function(fs, content, debug) {
    var grammar = fs.readFileSync(grammarFile, 'utf8').toString();
    // Build parser from grammar
    var parser = PEG.buildParser(grammar, { trace: debug });
    [...]
Run Code Online (Sandbox Code Playgroud)

这与在节点的命令行上执行的main.js一起工作正常.现在我想用karma,jasmine和PhantomJS来测试我的项目.我有一个像这样的karma.conf.js:

frameworks: ['jasmine', 'requirejs'],
files: [
  { pattern: './test/**/*.spec.js', included: false },
  { pattern: './js/**/*.js', included: false},
  './test/test-main.js',
],
Run Code Online (Sandbox Code Playgroud)

还有一个名为test-main.js的require bootstrap文件,它以这种方式配置:

'use strict';

var allTestFiles …
Run Code Online (Sandbox Code Playgroud)

javascript node.js requirejs pegjs karma-runner

12
推荐指数
1
解决办法
710
查看次数

如何使用PEG.js构建左关联运算符树?

如何使用PEG.js左关联运算符构建AST(抽象语法树)?

我试图根据我在互联网上找到的信息编写一些代码,但我似乎犯了一个错误.

我编写的代码为大多数表达式生成了不正确的AST.

表达

12-6-4-2*1-1
Run Code Online (Sandbox Code Playgroud)

预期的AST

{
    "left": {
        "left": {
            "left": {
                "left": 12,
                "operator": "-",
                "right": 6
            },
            "operator": "-",
            "right": 4
        },
        "operator": "-",
        "right": {
            "left": 2,
            "operator": "*",
            "right": 1
        }
    },
    "operator": "-",
    "right": 1
}
Run Code Online (Sandbox Code Playgroud)

生成AST

{
   "left": {
      "left": {
         "left": 12,
         "operator": "-",
         "right": 6
      },
      "operator": "-",
      "right": 4
   },
   "operator": "-",
   "right": {
      "left": 2,
      "operator": "*",
      "right": {
         "left": 1,
         "operator": "-", …
Run Code Online (Sandbox Code Playgroud)

javascript grammar abstract-syntax-tree peg pegjs

11
推荐指数
1
解决办法
1697
查看次数

加入不是函数

我在玩PEG.js

start = keyword

keyword = a:[a-z]? {return a.join("");}
Run Code Online (Sandbox Code Playgroud)

为什么我会在这里出现错误:

a.join 不是函数

当我输入一个有效的字符串时abc

javascript peg pegjs

11
推荐指数
1
解决办法
2万
查看次数

回溯如何在peg.js中工作(带示例)?

我已经定义了以下最小的Peg.js语法:

start  =  "A1" / "A123"
Run Code Online (Sandbox Code Playgroud)

您可以在沙箱中尝试.

我本来期望匹配"A1"以及"A123"(根据我的回溯如何运作的概念).但事实并非如此:语法识别"A1"但不识别"A123".

注意:我不是在寻找"颠倒你的术语顺序"的建议,如相关问题如何将简单语法转换为适用于PEG.js的东西(预期"a"但发现"a").相反,我希望了解我所看到的行为,以及为什么Peg.js的回溯在这种情况下不适用.有关为什么颠倒我的术语顺序没有帮助的解释,请参阅下面更实际的示例.


有关更实际的示例,请考虑单元解析.语法应该识别具有可选前缀的度量单位(如"m","mol"),如"mm","mmol",以及非"公制"单位,如"yr","week"或"mo".

以下Peg.js语法不会识别"mol",因为它会消耗掉"mo",并且不会回溯.(改变术语的顺序没有帮助;或者更确切地说,将导致"mo"以"mol"或"mmol"为代价被识别.)

start  =  nonmetric / metric / prefix metric
metric = "mol" / "l" / "m" / "g"
nonmetric = "yr" / "mo" / "week" / "day" / "hour"
prefix = "m" / "k" / "c"
Run Code Online (Sandbox Code Playgroud)

我可以在Antlr中做出类似的事情取得圆满成功:

grammar units;
start  :  nonmetric | metric | prefix metric;
metric : 'mol' | 'l' | 'm' | 'g';
nonmetric : 'yr' | 'mo' | 'week' | 'day' …
Run Code Online (Sandbox Code Playgroud)

grammar peg node.js pegjs

8
推荐指数
1
解决办法
1378
查看次数

如何用peg语法解析这个?

我正在尝试使用pegjs制作解析器.我需要解析类似的东西:

blah blah START Lorem ipsum 
dolor sit amet, consectetur 
adipiscing elit END foo bar 
etc.
Run Code Online (Sandbox Code Playgroud)

我有麻烦写作规则来从捕捉文本"START""END".

parsing peg pegjs

7
推荐指数
1
解决办法
1076
查看次数

在没有左手递归的情况下解析布尔表达式

我想要匹配这个

f(some_thing) == 'something else'
Run Code Online (Sandbox Code Playgroud)
  • f(some_thing)是一个函数调用,它是一个表达式
  • ==是一个布尔运算符
  • 'something else'是一个字符串,也是一个表达式

所以布尔表达式应该是

expression operator expression
Run Code Online (Sandbox Code Playgroud)

问题是我无法弄清楚如何在不离开递归的情况下做到这一点这些是我的规则

expression 
  = 
  bool_expression
  / function_call
  / string
  / real_number
  / integer
  / identifier

bool_expression
  = l:expression space* op:bool_operator space* r:expression 
  { return ... }
Run Code Online (Sandbox Code Playgroud)

使用语法符号,我有

O := ==|<=|>=|<|>|!=  // operators
E := B|....           // expression, many non terminals
B := EOE
Run Code Online (Sandbox Code Playgroud)

因为我的语法是EOE,我不知道如何使用左手算法

A := Ab|B
transforms into
A := BA'
A':= e|bA
Run Code Online (Sandbox Code Playgroud)

其中e为空,b为终端

grammar parsing peg pegjs

7
推荐指数
1
解决办法
893
查看次数

如何用PEG语法描述函数参数

我还在和Qt的qmake模糊语法作斗争.

现在我找不到一种方法来描述可以包含括号的函数参数(例如regex):

functionName(arg1, "arg2", ^(arg3)+$)
Run Code Online (Sandbox Code Playgroud)

我试图像这样描述函数调用:

FunctionCall = Identifier space* "(" space* FunctionArgumentList? space* ")" space* eol*

FunctionArgumentList = FunctionArgumentString ((space* "," space* FunctionArgumentString)* / (blank* FunctionArgumentString)*)
FunctionArgumentString = ReplaceFunctionCall / TestFunctionCall / EnquotedString / RegularFunctionArgumentString
RegularFunctionArgumentString = RegularFunctionArgumentStringChar+
RegularFunctionArgumentStringChar = !(")" / blank / "," / quote / doublequote) SourceCharacter
SourceCharacter <- [\u0000-\uFFFC]
Run Code Online (Sandbox Code Playgroud)

如何在这种语法中添加对嵌入式括号的支持而不使用引号/双引号?如何区分函数参数和函数关闭中的括号?

有效函数调用示例:

contains(CMAKE_INSTALL_LIBS_DIR, ^(/usr)?/lib(64)?.*)
Run Code Online (Sandbox Code Playgroud)

javascript grammar parsing peg pegjs

6
推荐指数
1
解决办法
279
查看次数