This commit is contained in:
@@ -0,0 +1,240 @@
|
||||
# -*- coding: utf-8 -*- #
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Rouge
|
||||
module Lexers
|
||||
load_lexer 'cpp.rb'
|
||||
|
||||
class FreeFEM < Cpp
|
||||
title "FreeFEM"
|
||||
desc "The FreeFEM programming language (freefem.org)"
|
||||
|
||||
tag 'freefem'
|
||||
aliases 'ff'
|
||||
filenames '*.edp', '*.idp'
|
||||
mimetypes 'text/x-ffhdr', 'text/x-ffsrc'
|
||||
|
||||
# Override C/C++ ones (for example, `do` does not exists)
|
||||
def self.keywords
|
||||
@keywords ||= Set.new(%w(
|
||||
break catch continue else for if return try while
|
||||
))
|
||||
end
|
||||
|
||||
# Override C/C++ ones (for example, `double` does not exists)
|
||||
def self.keywords_type
|
||||
@keywords_type ||= Set.new(%w(
|
||||
bool border complex dmatrix fespace func gslspline ifstream int macro
|
||||
matrix mesh mesh3 mpiComm mpiGroup mpiRequest NewMacro EndMacro
|
||||
ofstream Pmmap problem Psemaphore real solve string varf
|
||||
))
|
||||
end
|
||||
|
||||
# Override C/C++ ones (totally different)
|
||||
def self.reserved
|
||||
@reserved ||= Set.new(%w(
|
||||
BDM1 BDM1Ortho Edge03d Edge13d Edge23d FEQF HCT P0 P03d P0Edge P1
|
||||
P13d P1b P1b3d P1bl P1bl3d P1dc P1Edge P1nc P2 P23d P2b P2BR P2dc
|
||||
P2Edge P2h P2Morley P2pnc P3 P3dc P3Edge P4 P4dc P4Edge P5Edge RT0
|
||||
RT03d RT0Ortho RT1 RT1Ortho RT2 RT2Ortho
|
||||
|
||||
qf1pE qf1pElump qf1pT qf1pTlump qfV1 qfV1lump qf2pE qf2pT qf2pT4P1
|
||||
qfV2 qf3pE qf4pE qf5pE qf5pT qfV5 qf7pT qf9pT qfnbpE
|
||||
|
||||
ARGV append area be binary BoundaryEdge bordermeasure CG Cholesky cin
|
||||
cout Crout default diag edgeOrientation endl FILE fixed GMRES good
|
||||
hTriangle im imax imin InternalEdge l1 l2 label lenEdge length LINE
|
||||
linfty LU m max measure min mpiAnySource mpiBAND mpiBXOR mpiCommWorld
|
||||
mpiLAND mpiLOR mpiLXOR mpiMAX mpiMIN mpiPROD mpirank mpisize mpiSUM
|
||||
mpiUndefined n N nbe ndof ndofK noshowbase noshowpos notaregion nt
|
||||
nTonEdge nuEdge nuTriangle nv P pi precision quantile re region
|
||||
scientific searchMethod setw showbase showpos sparsesolver sum tellp
|
||||
true UMFPACK unused whoinElement verbosity version volume x y z
|
||||
))
|
||||
end
|
||||
|
||||
def self.builtins
|
||||
@builtins ||= Set.new(%w(
|
||||
abs acos acosh adaptmesh adj AffineCG AffineGMRES arg asin asinh
|
||||
assert atan atan2 atanh atof atoi BFGS broadcast buildlayers
|
||||
buildmesh ceil chi complexEigenValue copysign change checkmovemesh
|
||||
clock cmaes conj convect cos cosh cube d dd dfft diffnp diffpos
|
||||
dimKrylov dist dumptable dx dxx dxy dxz dy dyx dyy dyz dz dzx dzy dzz
|
||||
EigenValue emptymesh erf erfc exec exit exp fdim ffind find floor
|
||||
flush fmax fmin fmod freeyams getARGV getline gmshload gmshload3
|
||||
gslcdfugaussianP gslcdfugaussianQ gslcdfugaussianPinv
|
||||
gslcdfugaussianQinv gslcdfgaussianP gslcdfgaussianQ
|
||||
gslcdfgaussianPinv gslcdfgaussianQinv gslcdfgammaP gslcdfgammaQ
|
||||
gslcdfgammaPinv gslcdfgammaQinv gslcdfcauchyP gslcdfcauchyQ
|
||||
gslcdfcauchyPinv gslcdfcauchyQinv gslcdflaplaceP gslcdflaplaceQ
|
||||
gslcdflaplacePinv gslcdflaplaceQinv gslcdfrayleighP gslcdfrayleighQ
|
||||
gslcdfrayleighPinv gslcdfrayleighQinv gslcdfchisqP gslcdfchisqQ
|
||||
gslcdfchisqPinv gslcdfchisqQinv gslcdfexponentialP gslcdfexponentialQ
|
||||
gslcdfexponentialPinv gslcdfexponentialQinv gslcdfexppowP
|
||||
gslcdfexppowQ gslcdftdistP gslcdftdistQ gslcdftdistPinv
|
||||
gslcdftdistQinv gslcdffdistP gslcdffdistQ gslcdffdistPinv
|
||||
gslcdffdistQinv gslcdfbetaP gslcdfbetaQ gslcdfbetaPinv gslcdfbetaQinv
|
||||
gslcdfflatP gslcdfflatQ gslcdfflatPinv gslcdfflatQinv
|
||||
gslcdflognormalP gslcdflognormalQ gslcdflognormalPinv
|
||||
gslcdflognormalQinv gslcdfgumbel1P gslcdfgumbel1Q gslcdfgumbel1Pinv
|
||||
gslcdfgumbel1Qinv gslcdfgumbel2P gslcdfgumbel2Q gslcdfgumbel2Pinv
|
||||
gslcdfgumbel2Qinv gslcdfweibullP gslcdfweibullQ gslcdfweibullPinv
|
||||
gslcdfweibullQinv gslcdfparetoP gslcdfparetoQ gslcdfparetoPinv
|
||||
gslcdfparetoQinv gslcdflogisticP gslcdflogisticQ gslcdflogisticPinv
|
||||
gslcdflogisticQinv gslcdfbinomialP gslcdfbinomialQ gslcdfpoissonP
|
||||
gslcdfpoissonQ gslcdfgeometricP gslcdfgeometricQ
|
||||
gslcdfnegativebinomialP gslcdfnegativebinomialQ gslcdfpascalP
|
||||
gslcdfpascalQ gslinterpakima gslinterpakimaperiodic
|
||||
gslinterpcsplineperiodic gslinterpcspline gslinterpsteffen
|
||||
gslinterplinear gslinterppolynomial gslranbernoullipdf gslranbeta
|
||||
gslranbetapdf gslranbinomialpdf gslranexponential
|
||||
gslranexponentialpdf gslranexppow gslranexppowpdf gslrancauchy
|
||||
gslrancauchypdf gslranchisq gslranchisqpdf gslranerlang
|
||||
gslranerlangpdf gslranfdist gslranfdistpdf gslranflat gslranflatpdf
|
||||
gslrangamma gslrangammaint gslrangammapdf gslrangammamt
|
||||
gslrangammaknuth gslrangaussian gslrangaussianratiomethod
|
||||
gslrangaussianziggurat gslrangaussianpdf gslranugaussian
|
||||
gslranugaussianratiomethod gslranugaussianpdf gslrangaussiantail
|
||||
gslrangaussiantailpdf gslranugaussiantail gslranugaussiantailpdf
|
||||
gslranlandau gslranlandaupdf gslrangeometricpdf gslrangumbel1
|
||||
gslrangumbel1pdf gslrangumbel2 gslrangumbel2pdf gslranlogistic
|
||||
gslranlogisticpdf gslranlognormal gslranlognormalpdf
|
||||
gslranlogarithmicpdf gslrannegativebinomialpdf gslranpascalpdf
|
||||
gslranpareto gslranparetopdf gslranpoissonpdf gslranrayleigh
|
||||
gslranrayleighpdf gslranrayleightail gslranrayleightailpdf
|
||||
gslrantdist gslrantdistpdf gslranlaplace gslranlaplacepdf gslranlevy
|
||||
gslranweibull gslranweibullpdf gslsfairyAi gslsfairyBi
|
||||
gslsfairyAiscaled gslsfairyBiscaled gslsfairyAideriv gslsfairyBideriv
|
||||
gslsfairyAiderivscaled gslsfairyBiderivscaled gslsfairyzeroAi
|
||||
gslsfairyzeroBi gslsfairyzeroAideriv gslsfairyzeroBideriv
|
||||
gslsfbesselJ0 gslsfbesselJ1 gslsfbesselJn gslsfbesselY0 gslsfbesselY1
|
||||
gslsfbesselYn gslsfbesselI0 gslsfbesselI1 gslsfbesselIn
|
||||
gslsfbesselI0scaled gslsfbesselI1scaled gslsfbesselInscaled
|
||||
gslsfbesselK0 gslsfbesselK1 gslsfbesselKn gslsfbesselK0scaled
|
||||
gslsfbesselK1scaled gslsfbesselKnscaled gslsfbesselj0 gslsfbesselj1
|
||||
gslsfbesselj2 gslsfbesseljl gslsfbessely0 gslsfbessely1 gslsfbessely2
|
||||
gslsfbesselyl gslsfbesseli0scaled gslsfbesseli1scaled
|
||||
gslsfbesseli2scaled gslsfbesselilscaled gslsfbesselk0scaled
|
||||
gslsfbesselk1scaled gslsfbesselk2scaled gslsfbesselklscaled
|
||||
gslsfbesselJnu gslsfbesselYnu gslsfbesselInuscaled gslsfbesselInu
|
||||
gslsfbesselKnuscaled gslsfbesselKnu gslsfbessellnKnu
|
||||
gslsfbesselzeroJ0 gslsfbesselzeroJ1 gslsfbesselzeroJnu gslsfclausen
|
||||
gslsfhydrogenicR1 gslsfdawson gslsfdebye1 gslsfdebye2 gslsfdebye3
|
||||
gslsfdebye4 gslsfdebye5 gslsfdebye6 gslsfdilog gslsfmultiply
|
||||
gslsfellintKcomp gslsfellintEcomp gslsfellintPcomp gslsfellintDcomp
|
||||
gslsfellintF gslsfellintE gslsfellintRC gslsferfc gslsflogerfc
|
||||
gslsferf gslsferfZ gslsferfQ gslsfhazard gslsfexp gslsfexpmult
|
||||
gslsfexpm1 gslsfexprel gslsfexprel2 gslsfexpreln gslsfexpintE1
|
||||
gslsfexpintE2 gslsfexpintEn gslsfexpintE1scaled gslsfexpintE2scaled
|
||||
gslsfexpintEnscaled gslsfexpintEi gslsfexpintEiscaled gslsfShi
|
||||
gslsfChi gslsfexpint3 gslsfSi gslsfCi gslsfatanint gslsffermidiracm1
|
||||
gslsffermidirac0 gslsffermidirac1 gslsffermidirac2 gslsffermidiracint
|
||||
gslsffermidiracmhalf gslsffermidirachalf gslsffermidirac3half
|
||||
gslsffermidiracinc0 gslsflngamma gslsfgamma gslsfgammastar
|
||||
gslsfgammainv gslsftaylorcoeff gslsffact gslsfdoublefact gslsflnfact
|
||||
gslsflndoublefact gslsflnchoose gslsfchoose gslsflnpoch gslsfpoch
|
||||
gslsfpochrel gslsfgammaincQ gslsfgammaincP gslsfgammainc gslsflnbeta
|
||||
gslsfbeta gslsfbetainc gslsfgegenpoly1 gslsfgegenpoly2
|
||||
gslsfgegenpoly3 gslsfgegenpolyn gslsfhyperg0F1 gslsfhyperg1F1int
|
||||
gslsfhyperg1F1 gslsfhypergUint gslsfhypergU gslsfhyperg2F0
|
||||
gslsflaguerre1 gslsflaguerre2 gslsflaguerre3 gslsflaguerren
|
||||
gslsflambertW0 gslsflambertWm1 gslsflegendrePl gslsflegendreP1
|
||||
gslsflegendreP2 gslsflegendreP3 gslsflegendreQ0 gslsflegendreQ1
|
||||
gslsflegendreQl gslsflegendrePlm gslsflegendresphPlm
|
||||
gslsflegendrearraysize gslsfconicalPhalf gslsfconicalPmhalf
|
||||
gslsfconicalP0 gslsfconicalP1 gslsfconicalPsphreg gslsfconicalPcylreg
|
||||
gslsflegendreH3d0 gslsflegendreH3d1 gslsflegendreH3d gslsflog
|
||||
gslsflogabs gslsflog1plusx gslsflog1plusxmx gslsfpowint gslsfpsiint
|
||||
gslsfpsi gslsfpsi1piy gslsfpsi1int gslsfpsi1 gslsfpsin
|
||||
gslsfsynchrotron1 gslsfsynchrotron2 gslsftransport2 gslsftransport3
|
||||
gslsftransport4 gslsftransport5 gslsfsin gslsfcos gslsfhypot
|
||||
gslsfsinc gslsflnsinh gslsflncosh gslsfanglerestrictsymm
|
||||
gslsfanglerestrictpos gslsfzetaint gslsfzeta gslsfzetam1
|
||||
gslsfzetam1int gslsfhzeta gslsfetaint gslsfeta imag int1d int2d int3d
|
||||
intalledges intallfaces interpolate invdiff invdiffnp invdiffpos
|
||||
Isend isInf isNaN isoline Irecv j0 j1 jn jump lgamma LinearCG
|
||||
LinearGMRES log log10 lrint lround max mean medit min mmg3d movemesh
|
||||
movemesh23 mpiAlltoall mpiAlltoallv mpiAllgather mpiAllgatherv
|
||||
mpiAllReduce mpiBarrier mpiGather mpiGatherv mpiRank mpiReduce
|
||||
mpiScatter mpiScatterv mpiSize mpiWait mpiWaitAny mpiWtick mpiWtime
|
||||
mshmet NLCG on plot polar Post pow processor processorblock
|
||||
projection randinit randint31 randint32 random randreal1 randreal2
|
||||
randreal3 randres53 Read readmesh readmesh3 Recv rfind rint round
|
||||
savemesh savesol savevtk seekg Sent set sign signbit sin sinh sort
|
||||
splitComm splitmesh sqrt square srandom srandomdev Stringification
|
||||
swap system tan tanh tellg tetg tetgconvexhull tetgreconstruction
|
||||
tetgtransfo tgamma triangulate trunc Wait Write y0 y1 yn
|
||||
))
|
||||
end
|
||||
|
||||
def self.attributes
|
||||
@builtinsParameters ||= Set.new(%w(
|
||||
A A1 abserror absolute aniso aspectratio B B1 bb beginend bin
|
||||
boundary bw close cmm coef composante cutoff datafilename dataname
|
||||
dim distmax displacement doptions dparams eps err errg facemerge
|
||||
facetcl factorize file fill fixedborder flabel flags floatmesh
|
||||
floatsol fregion gradation grey hmax hmin holelist hsv init inquire
|
||||
inside IsMetric iso ivalue keepbackvertices label labeldown labelmid
|
||||
labelup levelset loptions lparams maxit maxsubdiv meditff mem memory
|
||||
metric mode nbarrow nbiso nbiter nbjacoby nboffacetcl nbofholes
|
||||
nbofregions nbregul nbsmooth nbvx ncv nev nomeshgeneration
|
||||
normalization omega op optimize option options order orientation
|
||||
periodic power precon prev ps ptmerge qfe qforder qft qfV ratio
|
||||
rawvector reffacelow reffacemid reffaceup refnum reftet reftri region
|
||||
regionlist renumv rescaling ridgeangle save sigma sizeofvolume
|
||||
smoothing solver sparams split splitin2 splitpbedge stop strategy
|
||||
swap switch sym t tgv thetamax tol tolpivot tolpivotsym transfo U2Vc
|
||||
value varrow vector veps viso wait width withsurfacemesh WindowIndex
|
||||
which zbound
|
||||
))
|
||||
end
|
||||
|
||||
id = /[a-z_]\w*/i
|
||||
|
||||
state :expr_bol do
|
||||
mixin :inline_whitespace
|
||||
|
||||
rule %r/include/, Comment::Preproc, :macro
|
||||
rule %r/load/, Comment::Preproc, :macro
|
||||
rule %r/ENDIFMACRO/, Comment::Preproc, :macro
|
||||
rule %r/IFMACRO/, Comment::Preproc, :macro
|
||||
|
||||
rule(//) { pop! }
|
||||
end
|
||||
|
||||
state :statements do
|
||||
mixin :whitespace
|
||||
rule %r/(u8|u|U|L)?"/, Str, :string
|
||||
rule %r((u8|u|U|L)?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, Str::Char
|
||||
rule %r((\d+[.]\d*|[.]?\d+)e[+-]?\d+[lu]*)i, Num::Float
|
||||
rule %r(\d+e[+-]?\d+[lu]*)i, Num::Float
|
||||
rule %r/0x[0-9a-f]+[lu]*/i, Num::Hex
|
||||
rule %r/0[0-7]+[lu]*/i, Num::Oct
|
||||
rule %r/\d+[lu]*/i, Num::Integer
|
||||
rule %r(\*/), Error
|
||||
rule %r([~!%^&*+=\|?:<>/-]), Operator
|
||||
rule %r/'/, Operator
|
||||
rule %r/[()\[\],.;]/, Punctuation
|
||||
rule %r/\bcase\b/, Keyword, :case
|
||||
rule %r/(?:true|false|NaN)\b/, Name::Builtin
|
||||
rule id do |m|
|
||||
name = m[0]
|
||||
|
||||
if self.class.keywords.include? name
|
||||
token Keyword
|
||||
elsif self.class.keywords_type.include? name
|
||||
token Keyword::Type
|
||||
elsif self.class.reserved.include? name
|
||||
token Keyword::Reserved
|
||||
elsif self.class.builtins.include? name
|
||||
token Name::Builtin
|
||||
elsif self.class.attributes.include? name
|
||||
token Name::Attribute
|
||||
else
|
||||
token Name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user