7

優れた C# パーサー ジェネレーターの投稿を調べた後、GPLEX と GPPG に出くわしました。GPLEX を使用して、GPPG がツリーを解析および作成するためのトークンを生成したいと考えています (lex/yacc の関係に似ています)。ただし、これら2つがどのように相互作用するかについての例を見つけることができないようです. 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;
%%

ありがとう!アンドリュー

4

5 に答える 5

4

最初に、参照「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:\temp\testFile.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) { }

于 2015-09-21T11:38:37.627 に答える
0

Roslyn の使用を検討しましたか? (これは適切な答えではありませんが、これをコメントとして投稿するのに十分な評判がありません)

于 2012-11-05T15:07:24.080 に答える