Hi, everyone.
I finished writing a canonical LR(1) parser. https://github.com/coshcage/yaclrcc
I hope this parser could be useful to you guys who want a pure C style parsing program.
The technique behind this parser is in the book Compilers Principles, Techniques and Tools (Second Edition).
However you can also advance this parser by involve developing it.
I tested this parser by using Pelles C and MSVC.
This is the file that I used to launch the parser:
#include <stdio.h>
#include <wchar.h>
#include "yaclrcc.h"
#define STR L"A : S;\nS : C C;\nC : 1 C;\nC : 2;\n"
size_t i, j;
const wchar_t * wc = L"ccccdddd";
P_QUEUE_L pq;
ptrdiff_t GetSymbol(void)
{
if (i < j)
{
return Lexer(pq, wc[i++]);
}
return 0;
}
int Reduce(ptrdiff_t n)
{
printf("REDUCE! %ld\n", n);
return CBF_TERMINATE;
}
void Error(void)
{
printf("ERROR!\n");
return CBF_TERMINATE;
}
int main()
{
P_MATRIX ptbl;
P_ARRAY_Z parrG = NULL;
pq = LexCompile(L"c\nd\n");
ptbl = ConstructCLRTable(STR, &parrG);
PrintCLRTable(ptbl);
j = wcslen(wc);
CLRParse(ptbl, parrG, GetSymbol, Reduce, Error);
LexDestroy(pq);
DestroyParrList(parrG);
DestroyCLRTable(ptbl);
return 0;
}
The parser reads this:
A : S;
S : C C;
C : 1 C;
C : 2;
grammar in and parse it to generate a parsing table like:
(-3) (-2) (1) (2) (2147483647)
3 2 4 5 0
0 0 0 0 2147483647
6 0 7 8 0
9 0 4 5 0
0 0 r3 r3 0
0 0 0 0 r1
10 0 7 8 0
0 0 0 0 r3
0 0 r2 r2 0
0 0 0 0 r2
REDUCE! 3
In the above grammar A,B and C instead of none-terminator and 1,2 means terminator from the lexical analyzer.
In the table, 2147483647 means ACC status.
I hope you enjoy this parser.
Regards.
Hi cosh,
Congratulations! This is so far out of my wheelhouse it's like reading Greek to me! But I'm sure others cognizant in this area will appreciate your efforts!
John Z
Quote from: John Z on February 13, 2024, 11:09:01 PM
Hi cosh,
Congratulations! This is so far out of my wheelhouse it's like reading Greek to me! But I'm sure others cognizant in this area will appreciate your efforts!
John Z
Thank you for your encouragement. Actually, Parser is a gadget that a compiler uses. We say a compiler contains these procedures: Lexical analyzing, Syntax analyzing(Parsing), Intermediate code generation and target code generation. You may reference to books that titled with compilers. :)