mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-17 14:51:51 +00:00
[qfcc] Implement glsl syntax
No semantics yet, but qfcc can parse some of QF's shaders. The grammar mostly follows that in the OpenGL Shading Language, Version 4.60.7 spec, but with a few less tokens.
This commit is contained in:
parent
b798cb2603
commit
2dd23f429a
8 changed files with 661 additions and 1437 deletions
|
@ -117,12 +117,16 @@ extern pr_info_t pr;
|
|||
|
||||
const char *file_basename (const char *filename, int keepdot) __attribute__((pure));
|
||||
|
||||
int glsl_yyparse (FILE *in);
|
||||
int qc_yyparse (FILE *in);
|
||||
int qp_yyparse (FILE *in);
|
||||
extern int pre_yydebug;
|
||||
extern int glsl_yydebug;
|
||||
extern int qc_yydebug;
|
||||
extern int qp_yydebug;
|
||||
|
||||
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
|
||||
|
||||
#ifdef _WIN32
|
||||
char *fix_backslash (char *path);
|
||||
#define NORMALIZE(x) fix_backslash (x)
|
||||
|
|
|
@ -163,4 +163,5 @@ int rua_parse (FILE *in, rua_parser_t *parser);
|
|||
const char *rua_directive_get_key (const void *dir, void *unused) __attribute__((pure));
|
||||
const char *rua_keyword_get_key (const void *dir, void *unused) __attribute__((pure));
|
||||
|
||||
|
||||
#endif//__rua_lang_h
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -102,6 +102,7 @@ parse_error (void *scanner)
|
|||
%right <op> '=' ASX
|
||||
%right '?' ':'
|
||||
%left OR
|
||||
%left XOR
|
||||
%left AND
|
||||
%left '|'
|
||||
%left '^'
|
||||
|
@ -113,15 +114,17 @@ parse_error (void *scanner)
|
|||
|
||||
%left SHL SHR
|
||||
%left '+' '-'
|
||||
%left '*' '/' '%' MOD SCALE GEOMETRIC
|
||||
%left '*' '/' '%' MOD SCALE GEOMETRIC QMUL QVMUL VQMUL
|
||||
%left HADAMARD CROSS DOT WEDGE REGRESSIVE
|
||||
%right SIZEOF UNARY INCOP REVERSE STAR DUAL
|
||||
%right SIZEOF UNARY INCOP REVERSE STAR DUAL UNDUAL
|
||||
%left HYPERUNARY
|
||||
%left '.' '(' '['
|
||||
|
||||
%token <expr> VALUE STRING
|
||||
%token <t> TOKEN
|
||||
// end of tokens comment between qc and preprocessor
|
||||
%token ELLIPSIS
|
||||
%token RESERVED
|
||||
// end of common tokens
|
||||
|
||||
%token <t.text> QSTRING HSTRING
|
||||
|
||||
|
@ -133,6 +136,7 @@ parse_error (void *scanner)
|
|||
%token IF IFDEF IFNDEF ELSE ELIF ELIFDEF ELIFNDEF ENDIF
|
||||
%token DEFINED EOD
|
||||
%token CONCAT ARGS
|
||||
%token EXTENSION VERSION
|
||||
|
||||
%type <t.text> string
|
||||
%type <macro> params opt_params body arg arg_list arg_clist
|
||||
|
@ -243,6 +247,13 @@ directive
|
|||
extra_warn
|
||||
| ENDIF { rua_endif (scanner); }
|
||||
extra_warn
|
||||
| EXTENSION ID ':' ID eod
|
||||
| VERSION VALUE opt_profile eod
|
||||
;
|
||||
|
||||
opt_profile
|
||||
: /* empty */
|
||||
| ID
|
||||
;
|
||||
|
||||
extra_warn
|
||||
|
|
|
@ -374,8 +374,6 @@ pp_vnumber '({s}*{m}?{pp_number}){2,4}{s}*'{ULFD}?
|
|||
|
||||
%%
|
||||
|
||||
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
|
||||
|
||||
static directive_t cond_directives[] = {
|
||||
{"if", PRE_IF},
|
||||
{"ifdef", PRE_IFDEF},
|
||||
|
@ -785,7 +783,7 @@ parse_vector (const rua_tok_t *tok, yyscan_t scanner)
|
|||
}
|
||||
|
||||
static int
|
||||
parse_string (QC_YYSTYPE *lval, const rua_tok_t *tok, int type,
|
||||
parse_string (rua_val_t *lval, const rua_tok_t *tok, int type,
|
||||
yyscan_t scanner)
|
||||
{
|
||||
const char *str = make_string (tok->text, 0);
|
||||
|
@ -980,7 +978,7 @@ convert_long (const expr_t *value)
|
|||
}
|
||||
|
||||
static int
|
||||
qc_token (rua_extra_t *extra, QC_YYSTYPE *lval, const rua_tok_t *tok,
|
||||
qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
|
||||
yyscan_t scanner)
|
||||
{
|
||||
int token = tok->token;
|
||||
|
|
|
@ -124,6 +124,7 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc);
|
|||
%right <op> '=' ASX
|
||||
%right '?' ':'
|
||||
%left OR
|
||||
%left XOR
|
||||
%left AND
|
||||
%left '|'
|
||||
%left '^'
|
||||
|
@ -142,12 +143,14 @@ int yylex (YYSTYPE *yylval, YYLTYPE *yylloc);
|
|||
%left '.' '(' '['
|
||||
|
||||
%token <expr> VALUE STRING TOKEN
|
||||
// end of tokens common between qc and qp
|
||||
%token ELLIPSIS
|
||||
%token RESERVED
|
||||
// end of common tokens
|
||||
|
||||
%token <symbol> CLASS_NAME NAME
|
||||
|
||||
%token LOCAL WHILE DO IF ELSE FOR BREAK CONTINUE
|
||||
%token RETURN AT_RETURN ELLIPSIS
|
||||
%token RETURN AT_RETURN
|
||||
%token NIL GOTO SWITCH CASE DEFAULT ENUM ALGEBRA
|
||||
%token ARGS TYPEDEF EXTERN STATIC SYSTEM OVERLOAD NOT ATTRIBUTE
|
||||
%token <op> STRUCT
|
||||
|
@ -2450,8 +2453,6 @@ obj_string
|
|||
|
||||
%%
|
||||
|
||||
#define ARRCOUNT(_k) (sizeof (_k) / sizeof (_k[0]))
|
||||
|
||||
// preprocessor directives in ruamoko and quakec
|
||||
static directive_t rua_directives[] = {
|
||||
{"include", PRE_INCLUDE},
|
||||
|
|
|
@ -100,6 +100,7 @@ typedef enum {
|
|||
lang_object,
|
||||
lang_ruamoko,
|
||||
lang_pascal,
|
||||
lang_glsl,
|
||||
} lang_t;
|
||||
|
||||
typedef struct ext_lang_s {
|
||||
|
@ -390,6 +391,9 @@ compile_to_obj (const char *file, const char *obj, lang_t lang)
|
|||
case lang_pascal:
|
||||
yyparse = qp_yyparse;
|
||||
break;
|
||||
case lang_glsl:
|
||||
yyparse = glsl_yyparse;
|
||||
break;
|
||||
default:
|
||||
internal_error (0, "unknown language enum");
|
||||
}
|
||||
|
@ -511,6 +515,12 @@ file_language (const char *file, const char *ext)
|
|||
{".c", lang_ruamoko},
|
||||
{".m", lang_ruamoko},
|
||||
{".qc", lang_ruamoko},
|
||||
{".comp", lang_glsl},
|
||||
{".vert", lang_glsl},
|
||||
{".tesc", lang_glsl},
|
||||
{".tese", lang_glsl},
|
||||
{".geom", lang_glsl},
|
||||
{".frag", lang_glsl},
|
||||
{".pas", lang_pascal},
|
||||
{".p", lang_pascal},
|
||||
{0, lang_object}, // unrecognized extension = object file
|
||||
|
|
|
@ -123,6 +123,7 @@ int yylex (void);
|
|||
%right <op> '=' ASX
|
||||
%right '?' ':'
|
||||
%left OR
|
||||
%left XOR
|
||||
%left AND
|
||||
%left '|'
|
||||
%left '^'
|
||||
|
|
Loading…
Reference in a new issue