解析器生成器:如何一起使用GPLEX和GPPG?

在查看好的C#解析器生成器的帖子后,我偶然发现了GPLEX和GPPG。 我想使用GPLEX为GPPG生成令牌来解析并创建树(类似于lex / yacc关系)。 但是,我似乎无法找到关于这两者如何相互作用的例子。 使用lex / yacc,lex返回由yacc定义的标记,并且可以将值存储在yylval中。 这是如何在GPLEX / GPPG中完成的(这是从他们的文档中丢失的)?

附加的是我想转换为GPLEX的lex代码:

%{
 #include <stdio.h>
 #include "y.tab.h"
%}
%%
[Oo][Rr]                return OR;
[Aa][Nn][Dd]            return AND;
[Nn][Oo][Tt]            return NOT;
[A-Za-z][A-Za-z0-9_]*   yylval=yytext; return ID;
%%

谢谢! 安德鲁


首先:在项目中包含参考“QUT.ShiftReduceParser.dll”。 它在GPLEX的下载包中提供。

主程序示例代码:

using System;
using ....;
using QUT.Gppg;
using Scanner;
using Parser;

namespace NCParser
{
class Program
{
    static void Main(string[] args)
    {
        string pathTXT = @"C:temptestFile.txt";
        FileStream file = new FileStream(pathTXT, FileMode.Open);
        Scanner scanner = new Scanner();
        scanner.SetSource(file, 0);
        Parser parser = new Parser(scanner);            
    }
}
}    

GPLEX的示例代码:

%using Parser;           //include the namespace of the generated Parser-class
%Namespace Scanner       //names the Namespace of the generated Scanner-class
%visibility public       //visibility of the types "Tokens","ScanBase","Scanner"
%scannertype Scanner     //names the Scannerclass to "Scanner"
%scanbasetype ScanBase   //names the Scanbaseclass to "ScanBase"
%tokentype Tokens        //names the Tokenenumeration to "Tokens"

%option codePage:65001 out:Scanner.cs /*see the documentation of GPLEX for further Options you can use */

%{ //user-specified code will be copied in the Output-file
%}

OR [Oo][Rr]
AND [Aa][Nn][Dd]
Identifier [A-Za-z][A-Za-z0-9_]*

%% //Rules Section
%{ //user-code that will be executed before getting the next token
%}

{OR}           {return (int)Tokens.kwAND;}
{AND}          {return (int)Tokens.kwAND;}
{Identifier}   {yylval = yytext; return (int)Tokens.ID;}

%% //User-code Section

GPPG输入文件的示例代码:

%using Scanner      //include the Namespace of the scanner-class
%output=Parser.cs   //names the output-file
%namespace Parser  //names the namespace of the Parser-class

%parsertype Parser      //names the Parserclass to "Parser"
%scanbasetype ScanBase  //names the ScanBaseclass to "ScanBase"
%tokentype Tokens       //names the Tokensenumeration to "Tokens"

%token kwAND "AND", kwOR "OR" //the received Tokens from GPLEX
%token ID

%% //Grammar Rules Section

program  : /* nothing */
         | Statements
         ;

Statements : EXPR "AND" EXPR
           | EXPR "OR" EXPR
           ;

EXPR : ID
     ;

%% User-code Section
// Don't forget to declare the Parser-Constructor
public Parser(Scanner scnr) : base(scnr) { }

C#parsegppggplex


我有一个类似的问题 - 由于明显缺乏文档,不知道如何使用GPLEX中的GPPG输出。 我认为问题源于以下事实:GPLEX分发版包含gppg.exe和gplex.exe,但仅包含GPLEX的文档。

如果您进入GPPG主页并下载该发行版,您将获得GPPG的文档,其中描述了输入文件的要求,如何构建语法等。噢,您还将再次获得两个二进制文件 - gppg .exe和gplex.exe。

几乎看起来只是将所有内容都包含在一个包中会更简单。 它可以明确地澄清一些混淆,特别是那些对词法分析(标记化)和解析可能不熟悉的人(对于两者之间的区别可能不是100%熟悉)。

无论如何,对于那些可能第一次这样做的人来说:

GPLEX http://gplex.codeplex.com - 用于标记/扫描/词法分析(同一事物)

GPPG http://gppg.codeplex.com/ - 将分词器的输出作为输入进行分析。 例如,解析器使用语法,并且可以做简单的标记器不能做的事情,比如检测括号集合是否匹配。


你有没有考虑过使用Roslyn? (这不是一个正确的答案,但我没有足够的声望将其作为评论发布)

链接地址: http://www.djcxy.com/p/10827.html

上一篇: Parser Generator: How to use GPLEX and GPPG together?

下一篇: What causes TypeError: undefined is not a function?