解析器生成器:如何一起使用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