summaryrefslogtreecommitdiffstats
path: root/poxml/gettext.g
diff options
context:
space:
mode:
Diffstat (limited to 'poxml/gettext.g')
-rw-r--r--poxml/gettext.g168
1 files changed, 168 insertions, 0 deletions
diff --git a/poxml/gettext.g b/poxml/gettext.g
new file mode 100644
index 00000000..8da92334
--- /dev/null
+++ b/poxml/gettext.g
@@ -0,0 +1,168 @@
+
+header "pre_include_hpp" {
+#include <string>
+using namespace std;
+#include "parser.h"
+}
+
+options {
+ language="Cpp";
+}
+
+{
+#include <iostream>
+#include "GettextLexer.hpp"
+#include "GettextParser.hpp"
+#include "antlr/AST.hpp"
+#include "antlr/CommonAST.hpp"
+
+/*
+int main()
+{
+ ANTLR_USING_NAMESPACE(std)
+ ANTLR_USING_NAMESPACE(antlr)
+ try {
+ GettextLexer lexer(cin);
+ GettextParser parser(lexer);
+ parser.file();
+
+ } catch(exception& e) {
+ cerr << "exception: " << e.what() << endl;
+ }
+}
+*/
+}
+
+class GettextParser extends Parser;
+
+options {
+ codeGenMakeSwitchThreshold = 3;
+ codeGenBitsetTestThreshold = 4;
+}
+
+file returns [ MsgList ml ]
+{
+string c, mi, ms;
+MsgBlock mb;
+MsgList ml2;
+}
+ : (comment T_MSGID) => (mb=file_block ml2=file { ml = ml2; ml.append(mb); } )
+ | (comment EOF) => c=comment { (void)c; }
+ ;
+
+file_block returns [ MsgBlock mb ]
+{
+string c, mi, mip, ms;
+}
+ : c=comment mi=msgid
+ (
+ ( ms=msgstr {
+ mb.comment = QString::fromUtf8(c.c_str());
+ mb.msgid = QString::fromUtf8(mi.c_str());
+ mb.msgstr = QString::fromUtf8(ms.c_str());
+ }
+ )
+ |
+ ( mip=msgid_plural ms=msgstr_plural {
+ mb.comment = QString::fromUtf8(c.c_str());
+ mb.msgid = QString::fromUtf8(mi.c_str());
+ mb.msgid_plural = QString::fromUtf8(mip.c_str());
+ mb.msgstr = QString::fromUtf8(ms.c_str());
+ }
+ )
+ )
+ ;
+
+comment returns [string s]
+{
+string r;
+}
+ : (c:T_COMMENT r=comment { s = c->getText() + r; } )
+ | /* nothing */
+ ;
+
+msgid returns [string s]
+ : T_MSGID t:T_STRING { s = t->getText(); }
+ ;
+
+msgid_plural returns [string s]
+ : T_MSGID_PLURAL t:T_STRING { s = t->getText(); }
+ ;
+
+msgstr returns [string s]
+ : T_MSGSTR t:T_STRING { s = t->getText(); }
+ ;
+
+msgstr_plural returns [string s]
+ : (
+ T_MSGSTR L_BRACKET n:T_INT R_BRACKET t:T_STRING { s = t->getText(); }
+ )+
+ ;
+
+class GettextLexer extends Lexer;
+options {
+ charVocabulary = '\u0000'..'\u00FF';
+ testLiterals=false; // don't automatically test for literals
+}
+
+WS
+ : (' ' | '\t'
+ | ('\n' | "\r\n") { newline(); }
+ ) { $setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP); }
+ ;
+
+L_BRACKET: '[' ;
+
+R_BRACKET: ']' ;
+
+T_INT : ( '0'..'9' )+
+ ;
+
+T_COMMENT : '#' (~'\n')*
+ ;
+
+MSG_TAG : "msg" ( ("id") (
+ "" { $setType(T_MSGID); }
+ | "_plural" { $setType(T_MSGID_PLURAL); }
+ )
+ | "str" { $setType(T_MSGSTR); }
+ )
+ ;
+
+T_STRING
+ : ('"'! (ESC|~'"')* ('"'! (' ' | 't')*! '\n'! { newline(); } (' '! | '\t'!)*))+
+ ;
+
+// copied from example
+protected
+ESC : '\\'
+ ( 'n'
+ | 'r'
+ | 't'
+ | 'b'
+ | 'f'
+ | '"'
+ | '\''
+ | '\\'
+ | ('0'..'3')
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : ('0'..'9')
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : '0'..'9'
+ )?
+ )?
+ | ('4'..'7')
+ (
+ options {
+ warnWhenFollowAmbig = false;
+ }
+ : ('0'..'9')
+ )?
+ )
+ ;