📄 test.g
字号:
/* This is test.g which tests a simple DLG-based scanner. * No garbage collection for tokens since our token can't * handle ref counting. *//* ANTLR will assign token type numbers (by creating an enum which you * get in tokens.h) */<</* user must define ANTLRToken */typedef char ANTLRChar;class ANTLRToken : public ANTLRAbstractToken {protected: ANTLRTokenType _type; // what's the token type of the token object int _line; // track line info for errors /* For our simple purposes, a token and a string is enough for * our attribute */ ANTLRChar _text[30];public: ANTLRToken(ANTLRTokenType t, ANTLRChar *s) { setType(t); _line = 0; setText(s); } /* Your derived class MUST have a blank constructor. */ ANTLRToken() { setType((ANTLRTokenType)0); _line = 0; setText(""); } // how to access the token type and line number stuff ANTLRTokenType getType() const { return _type; } void setType(ANTLRTokenType t) { _type = t; } virtual int getLine() const { return _line; } void setLine(int line) { _line = line; } // // warning - casting away const in ANTLRToken::getText() const // ANTLRChar *getText() const { return (ANTLRChar *) _text; } void setText(const ANTLRChar *s) { strncpy(_text, s, 30); } /* WARNING WARNING WARNING: you must return a stream of distinct tokens */ /* This function will disappear when I can use templates */ virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt, ANTLRChar *txt, int line) { ANTLRAbstractToken *t = new ANTLRToken(tt,txt); t->setLine(line); return t; }};/* "DLGLexer" must match what you use on DLG command line (-cl); * "DLGLexer" is the default. */#include "DLGLexer.h" /* include definition of DLGLexer. * This cannot be generated automatically because * ANTLR has no idea what you will call this file * with the DLG command-line options. */int main(){ DLGFileInput in(stdin); /* create input stream for DLG to get chars from */ DLGLexer scan(&in); /* create scanner reading from stdin */ ANTLRTokenBuffer pipe(&scan);/* make buffered pipe between lexer&parser */ ANTLRTokenPtr aToken=new ANTLRToken; // create a token to fill in for DLG scan.setToken(mytoken(aToken)); Expr parser(&pipe); /* create parser of type Expr hooked to scanner */ parser.init(); /* init the parser; prime lookahead etc... */ parser.e(); /* start parsing at rule 'e' of that parser */ return 0;}>>#token "[\ \t\n]+" <<skip();>>#token Eof "@"#tokclass My { IDENTIFIER NUMBER }class Expr { /* Define a grammar class */e : My My Eof <<fprintf(stderr, "text is %s,%s\n", $1->getText(), $2->getText());>> ;}#token IDENTIFIER "[a-z]+"#token NUMBER "[0-9]+"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -