Disable localized digits (Bug #644980)
[gcalctool.git] / src / mp-equation-lexer.l
blobf8023c0553076e730e82809bc4335088d8003636
1 %option 8bit reentrant bison-locations
2 %option never-interactive
3 %option noyywrap noinput nounput
4 %option prefix="_mp_equation_"
5 %option extra-type="MPEquationParserState *"
6 %option outfile="mp-equation-lexer.c" header-file="mp-equation-lexer.h"
8 %{
9 /*  Copyright (c) 2004-2008 Sami Pietila
10  *  Copyright (c) 2008-2009 Robert Ancell
11  *
12  *  This program is free software; you can redistribute it and/or modify
13  *  it under the terms of the GNU General Public License as published by
14  *  the Free Software Foundation; either version 2, or (at your option)
15  *  any later version.
16  *
17  *  This program is distributed in the hope that it will be useful, but
18  *  WITHOUT ANY WARRANTY; without even the implied warranty of
19  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  *  General Public License for more details.
21  *
22  *  You should have received a copy of the GNU General Public License
23  *  along with this program; if not, write to the Free Software
24  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25  *  02111-1307, USA.
26  */
28 #include <stdlib.h>
29 #include <string.h>
30 #include <sys/types.h>
32 #include "mp-equation-private.h"
33 #include "mp-equation-parser.h"
34 #include "mp-equation.h"
38 ZERO          "0"|"〇"|"٠"|"۰"|"߀"|"०"|"০"|"੦"|"૦"|"୦"|"௦"|"౦"|"೦"|"൦"|"๐"|"໐"|"༠"|"၀"|"႐"|"០"|"᠐"|"᥆"|"᧐"|"᭐"|"᮰"|"᱀"|"᱐"|"꘠"|"꣐"|"꤀"|"꩐"|"𐒠"
39 ONE           "1"|"〡"|"١"|"۱"|"߁"|"१"|"১"|"੧"|"૧"|"୧"|"௧"|"౧"|"೧"|"൧"|"๑"|"໑"|"༡"|"၁"|"႑"|"១"|"᠑"|"᥇"|"᧑"|"᭑"|"᮱"|"᱁"|"᱑"|"꘡"|"꣑"|"꤁"|"꩑"|"𐒡"
40 TWO           "2"|"〢"|"٢"|"۲"|"߂"|"२"|"২"|"੨"|"૨"|"୨"|"௨"|"౨"|"೨"|"൨"|"๒"|"໒"|"༢"|"၂"|"႒"|"២"|"᠒"|"᥈"|"᧒"|"᭒"|"᮲"|"᱂"|"᱒"|"꘢"|"꣒"|"꤂"|"꩒"|"𐒢"
41 THREE         "3"|"〣"|"٣"|"۳"|"߃"|"३"|"৩"|"੩"|"૩"|"୩"|"௩"|"౩"|"೩"|"൩"|"๓"|"໓"|"༣"|"၃"|"႓"|"៣"|"᠓"|"᥉"|"᧓"|"᭓"|"᮳"|"᱃"|"᱓"|"꘣"|"꣓"|"꤃"|"꩓"|"𐒣"
42 FOUR          "4"|"〤"|"٤"|"۴"|"߄"|"४"|"৪"|"੪"|"૪"|"୪"|"௪"|"౪"|"೪"|"൪"|"๔"|"໔"|"༤"|"၄"|"႔"|"៤"|"᠔"|"᥊"|"᧔"|"᭔"|"᮴"|"᱄"|"᱔"|"꘤"|"꣔"|"꤄"|"꩔"|"𐒤"
43 FIVE          "5"|"〥"|"٥"|"۵"|"߅"|"५"|"৫"|"੫"|"૫"|"୫"|"௫"|"౫"|"೫"|"൫"|"๕"|"໕"|"༥"|"၅"|"႕"|"៥"|"᠕"|"᥋"|"᧕"|"᭕"|"᮵"|"᱅"|"᱕"|"꘥"|"꣕"|"꤅"|"꩕"|"𐒥"
44 SIX           "6"|"〦"|"٦"|"۶"|"߆"|"६"|"৬"|"੬"|"૬"|"୬"|"௬"|"౬"|"೬"|"൬"|"๖"|"໖"|"༦"|"၆"|"႖"|"៦"|"᠖"|"᥌"|"᧖"|"᭖"|"᮶"|"᱆"|"᱖"|"꘦"|"꣖"|"꤆"|"꩖"|"𐒦"
45 SEVEN         "7"|"〧"|"٧"|"۷"|"߇"|"७"|"৭"|"੭"|"૭"|"୭"|"௭"|"౭"|"೭"|"൭"|"๗"|"໗"|"༧"|"၇"|"႗"|"៧"|"᠗"|"᥍"|"᧗"|"᭗"|"᮷"|"᱇"|"᱗"|"꘧"|"꣗"|"꤇"|"꩗"|"𐒧"
46 EIGHT         "8"|"〨"|"٨"|"۸"|"߈"|"८"|"৮"|"੮"|"૮"|"୮"|"௮"|"౮"|"೮"|"൮"|"๘"|"໘"|"༨"|"၈"|"႘"|"៨"|"᠘"|"᥎"|"᧘"|"᭘"|"᮸"|"᱈"|"᱘"|"꘨"|"꣘"|"꤈"|"꩘"|"𐒨"
47 NINE          "9"|"〩"|"٩"|"۹"|"߉"|"९"|"৯"|"੯"|"૯"|"୯"|"௯"|"౯"|"೯"|"൯"|"๙"|"໙"|"༩"|"၉"|"႙"|"៩"|"᠙"|"᥏"|"᧙"|"᭙"|"᮹"|"᱉"|"᱙"|"꘩"|"꣙"|"꤉"|"꩙"|"𐒩"
48 DECIMAL       "."|","
49 DEC           {ZERO}|{ONE}|{TWO}|{THREE}|{FOUR}|{FIVE}|{SIX}|{SEVEN}|{EIGHT}|{NINE}
50 HEX           {DEC}|[A-Fa-f]
51 SUPER_DIGITS  "⁰"|"¹"|"²"|"³"|"⁴"|"⁵"|"⁶"|"⁷"|"⁸"|"⁹"
52 SUPER_MINUS   "⁻"
53 SUB_DIGITS    "₀"|"₁"|"₂"|"₃"|"₄"|"₅"|"₆"|"₇"|"₈"|"₉"
54 FRACTION      "½"|"⅓"|"⅔"|"¼"|"¾"|"⅕"|"⅖"|"⅗"|"⅘"|"⅙"|"⅚"|"⅛"|"⅜"|"⅝"|"⅞"
55 GREEKS        "α"|"β"|"γ"|"δ"|"ε"|"ζ"|"η"|"θ"|"ι"|"κ"|"λ"|"μ"|"ν"|"ξ"|"ο"|"π"|"ρ"|"ς"|"σ"|"τ"|"υ"|"φ"|"χ"|"ψ"|"ω"
56 DEGREES       "°"
57 MINUTES       "'"
58 SECONDS       "\""
59 LETTERS       [a-zA-Z]|{GREEKS}
61 SUP_NUM  {SUPER_DIGITS}+
62 NSUP_NUM {SUPER_MINUS}{SUPER_DIGITS}+
63 SUB_NUM  {SUB_DIGITS}+
64 WORD     {LETTERS}+
65 DEC_NUM  {DEC}+|{DEC}*{DECIMAL}{DEC}+
66 DEF_NUM  {HEX}+|{HEX}*{DECIMAL}{HEX}+
67 BASE_NUM {HEX}+{SUB_NUM}|{HEX}*{DECIMAL}{HEX}+{SUB_NUM}
68 ANGLE_NUM {DEC_NUM}{DEGREES}|{DEC}+{DEGREES}{DEC_NUM}{MINUTES}|{DEC}+{DEGREES}{DEC}+{MINUTES}{DEC_NUM}{SECONDS}
70 NUMBER   {DEF_NUM}|{BASE_NUM}|{FRACTION}|{DEC}+{FRACTION}|{ANGLE_NUM}
71 VARIABLE {WORD}|{WORD}{SUB_NUM}|{GREEKS}
73 MOD  [mM][oO][dD]
74 AND  "∧"|[aA][nN][dD]
75 OR   "∨"|[oO][rR]
76 XOR  "⊻"|"⊕"|[xX][oO][rR]
77 NOT  "¬"|"~"|[nN][oO][tT]
78 RE   "⃰ℜ"
79 IM   "ℑ"
80 IN   [iI][nN]
84 "+"         {return tADD;}
85 "-"|"−"     {return tSUBTRACT;}
86 "*"|"×"     {return tMULTIPLY;}
87 "/"|"∕"|"÷" {return tDIVIDE;}
88 {MOD}       {return tMOD;}
89 "⌊"         {return tLFLOOR;}
90 "⌋"         {return tRFLOOR;}
91 "⌈"         {return tLCEILING;}
92 "⌉"         {return tRCEILING;}
93 "√"         {return tROOT;}
94 "∛"         {return tROOT3;}
95 "∜"         {return tROOT4;}
96 {NOT}       {return tNOT;}
97 {AND}       {return tAND;}
98 {OR}        {return tOR;}
99 {XOR}       {return tXOR;}
100 {IN}        {return tIN;}
101 {NUMBER}    {if (mp_set_from_string(yytext, _mp_equation_get_extra(yyscanner)->options->base, &yylval->int_t) != 0) REJECT; return tNUMBER;}
102 {SUP_NUM}   {yylval->integer = super_atoi(yytext); return tSUPNUM;}
103 {NSUP_NUM}  {yylval->integer = super_atoi(yytext); return tNSUPNUM;}
104 {SUB_NUM}   {yylval->integer = sub_atoi(yytext); return tSUBNUM;}
105 {VARIABLE}  {\
106     MPEquationParserState *state = _mp_equation_get_extra(yyscanner);\
107     if (state->function_is_defined(state, yytext)) {\
108         yylval->name = strdup(yytext);\
109         return tFUNCTION;\
110     }\
111     else {\
112         yylval->name = strdup(yytext);\
113         return tVARIABLE;\
114     }\
116 [ \r\t\n]
117 .           {return *yytext;}