Why Pegged action dont not work in this case ?

Basile B. b2.temp at gmx.com
Sun Apr 19 16:47:06 UTC 2020


I 've started experimenting Pegged action. Quickly i got blocked 
by this problem. The start action works where I use the rule but 
not directly in the rule. Test program:

gdb_commander.d:
---
/+dub.sdl:
dependency "pegged" version="~>0.4.4"
versions "dub_run"
+/
module gdb_commander;

import core.stdc.string, std.json;
import pegged.grammar, pegged.peg;

enum gdbMiOutput = `GdbmiOutput:

     Output          < OutOfBandRecord* ResultRecord? '(gdb)' 
#HERE before ResRec OK
     ResultRecord    < {beginResultRecord} Token? '^' ResultClass 
(',' Result)* {endResultRecord}
     OutOfBandRecord < AsyncRecord
                     / StreamRecord
     AsyncRecord     < ExecAsyncOutput
                     / StatusAsyncOutput
                     / NotifyAsyncOutput
     ExecAsyncOutput < Token? '*' AsyncOutput
     StatusAsyncOutput   < Token? '+' AsyncOutput
     NotifyAsyncOutput   < Token? '=' AsyncOutput
     AsyncOutput     < AsyncClass ( ',' Result )*
     ResultClass     < 'done'
                     / 'running'
                     / 'connected'
                     / 'error'
                     / 'exit'
     AsyncClass      < 'stopped'
     Result          < Variable '=' Value
     Variable        < String
     Value           < Const / Object / List
     Const           < CString
     Object          < '{}'
                     / '{' Result ( ',' Result )* '}'
     List            < '[]'
                     / '[' Value ( ',' Value )* ']'
                     / '[' Result ( ',' Result )* ']'
     StreamRecord    < ConsoleStreamOutput
                     / TargetStreamOutput
                     / LogStreamOutput
     ConsoleStreamOutput < '~' CString
     TargetStreamOutput  < '@' CString
     LogStreamOutput     < '&' CString
     Token           <~ [a-zA-Z_][a-zA-Z0-9_]*
     CString         <~ "\"" (EscapedQuotes / (!"\"" .) )* :"\""
     EscapedQuotes   <~ backslash doublequote
     String          <~ [a-zA-Z0-9_\-]*`;

T beginResultRecord(T)(T t)
{
     import std.stdio;
     writeln(__PRETTY_FUNCTION__);
     return t;
}

T endResultRecord(T)(T t)
{
     import std.stdio;
     writeln(t);
     return t;
}

mixin(grammar(gdbMiOutput));

version(dub_run)
{
     import std.stdio, std.path, std.file, std.process;
     import pegged.tohtml;

     enum testString01 = `^done,path="/usr/bin"
     (gdb)`;
     enum testString02 = `^done,threads=[
     {id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
     frame={level="0",addr="0xffffe410",func="__kernel_vsyscall",
     args=[]},state="running"},
     {id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
     frame={level="0",addr="0x0804891f",func="foo",
     args=[{name="i",value="10"}],
     
file="/tmp/a.c",fullname="/tmp/a.c",line="158",arch="i386:x86_64"},
     state="running"}],
     current-thread-id="1"
     (gdb)`;
     enum testString03 = `^done,new-thread-id="3",
     frame={level="0",func="vprintf",
     args=[{name="format",value="0x8048e9c \"%*s%c %d %c\\n\""},
     
{name="arg",value="0x2"}],file="vprintf.c",line="31",arch="i386:x86_64"}
     (gdb)`;

     void exportHTMLandBrowse(T)(auto ref T tree, string name)
     {
         string fname = __FILE_FULL_PATH__.dirName ~ "/" ~ name ~ 
".html";
         if (fname.exists)
             remove(fname);
         toHTML(tree, fname);
         browse(fname);
     }

     void main()
     {
         GdbmiOutput(testString01).exportHTMLandBrowse("t1");
         GdbmiOutput(testString02).exportHTMLandBrowse("t2");
         GdbmiOutput(testString03).exportHTMLandBrowse("t3");
     }
}
---

---
$ dub gdb_commander.d
---

Also I'd like to report that actions dont work with partially 
specialized templates:

---
T handleResultRecord(bool end,  T)(T t);
// then you use handleResultRecord!true and 
handleResultRecord!false in the PEG.
---


More information about the Digitalmars-d-learn mailing list